Se me ocurre algo como esto:
Código Javascript
:
Ver originalvar todos = [5, 2, 3, 8, 4, 7, 5, 9, 6, 2],
grupo1 = [], grupo2 = [], tot1 = 0, tot2 = 0;
grupo1.push(Math.max.apply(null, todos)); //Obtengo el valor mayor y lo inserto en 'grupo1'
tot1 += Math.max.apply(null, todos); //Acumulo el valor en 'tot1'
todos.splice(todos.indexOf(Math.max.apply(null, todos)), 1); //Y lo quito de 'todos'
grupo2.push(Math.max.apply(null, todos)); //Obtengo el nuevo valor mayor y lo inserto en 'grupo2'
tot2 += Math.max.apply(null, todos); //Acumulo el valor en 'tot2'
todos.splice(todos.indexOf(Math.max.apply(null, todos)), 1); //Y lo quito de 'todos'
for (var i = 0, l = todos.length; i < l; i++){
r = tot1 - tot2;
if (r <= 5 && r >= -5){
if (tot1 > tot2){
grupo2.push(todos[i]);
tot2 += todos[i];
}
else{
grupo1.push(todos[i]);
tot1 += todos[i];
}
}
else{
if (tot1 > tot2){
grupo2.push(todos[i]);
tot2 += todos[i];
}
else{
grupo1.push(todos[i]);
tot1 += todos[i];
}
}
}
console.log(grupo1, grupo2); //[9, 2, 3, 7, 6] [8, 5, 4, 5, 2] | tot1 - tot2 = 3
Trabajando con los rangos que estableciste en uno de tus comentarios, la adición de elementos a un array u otro dependerá ya sea de si la diferencia se encuentra dentro del rango. Quizá pueda hacerse esto de una manera más eficiente, esta es solo una primitiva y básica idea.
Edito: Repensando el algoritmo, creo que es mejor empezar por tomar a los dos mayores valores del array inicial, colocarlos en los arrays y a partir de ahí empezar la selección. Como cuando los dos mejores son los que forman a los equipos en un partido de fútbol entre amigos (al menos así jugábamos
).
Saludos