Necesito obtener la mejor combinación de números de los numbers de matriz que están más cerca del número max . (se permiten numbers de suma de números de matriz)
var numbers = [2, 5, 3, 7, 9, 20, 54, 89, 10]; // some numbers in array var max = 10; // the highest possible number we want to get from array var highest = [];En este caso, la salida debe ser (3, 7) o (2, 5, 3) o (10), la salida no debe ser 9
He hecho esto, pero esto no es lo que quiero.
var possibles = numbers.filter(number => number <= max); highest.push(Math.max(...possibles)); possibles.sort((a,b) => b - a); possibles.forEach(number =>{ if( (max - highest[0]) <= number){ highest.push(Math.max(...possibles)); } });La salida en este caso es 9, que no es el número más alto posible.
Podría adoptar un enfoque recursivo utilizando algunos métodos para minimizar los datos y la iteración.
En primer lugar, se necesita una variable para mantener una suma mínima real de todos los valores de una matriz temporal a la right .
Otra función comprueba si ya existe una matriz con el mismo valor en la matriz de resultados.
Al final, iter realiza algunas comprobaciones para salir o agregar right al result y finalmente bifurca la llamada a sí mismo utilizando el valor real o no.
El conjunto de resultados contiene todos los resultados posibles con la suma máxima posible.
function getMax(values, max) { const includes = (arrays, array) => arrays.some(a => a.join() === array.join()), iter = ([value, ...left], right = [], sum = 0) => { ++count; if (sum > max) return; if (sum > min) { result = [right]; min = sum; } else if (sum === min && !includes(result, right)) { result.push(right); } if (sum === max || value === undefined) return; iter(left, [...right, value], sum + value); iter(left, [...right], sum); }; let min = 0, count = 0, result = []; iter(values.filter(v => v <= max).sort((a, b) => b - a)); console.log('iterations', count); return result; } getMax([2, 5, 3, 7, 9, 20, 54, 89, 10], 10).map(a => console.log(...a)); .as-console-wrapper { max-height: 100% !important; top: 0; }