Je n'ai pas aimé la solution Javascript que j'ai vue ci-dessus. Voici celle que j'ai construite en utilisant l'application partielle, les fermetures et la récursion :
Ok, je m'inquiétais surtout de savoir si le tableau des combinaisons pouvait satisfaire aux exigences de l'objectif. J'espère que cette approche vous permettra de trouver les autres combinaisons.
Ici, il suffit de définir la cible et de passer le tableau des combinaisons.
function main() {
const target = 10
const getPermutationThatSumT = setTarget(target)
const permutation = getPermutationThatSumT([1, 4, 2, 5, 6, 7])
console.log( permutation );
}
l'implémentation actuelle que j'ai trouvée
function setTarget(target) {
let partial = [];
return function permute(input) {
let i, removed;
for (i = 0; i < input.length; i++) {
removed = input.splice(i, 1)[0];
partial.push(removed);
const sum = partial.reduce((a, b) => a + b)
if (sum === target) return partial.slice()
if (sum < target) permute(input)
input.splice(i, 0, removed);
partial.pop();
}
return null
};
}
9 votes
L'article de wikipedia ( fr.wikipedia.org/wiki/Sous-ensemble_somme_problème ) mentionne même que ce problème est une bonne introduction à la classe des problèmes NP-complets.
6 votes
Peut-on utiliser plus d'une fois le même élément de l'ensemble original ? Par exemple, si l'entrée est {1,2,3,5} et la cible 10, est-ce que 5 + 5 = 10 est une solution acceptable ?
0 votes
Juste une fois. Si un nombre entier doit être répété, il apparaît comme un nouvel élément.
1 votes
stackoverflow.com/a/64380474/585411 montre comment utiliser la programmation dynamique pour éviter tout travail inutile dans la production des réponses.