Le problème de la somme des sous-ensembles est le problème de créer un algorithme qui prend un tableau et une somme et renvoie tous les sous-ensembles du tableau d'arguments dont la somme est égale à la somme donnée. J'essaie de résoudre une variante du problème de la somme des sous-ensembles (en utilisant JavaScript) dans laquelle seuls les entiers non négatifs sont autorisés et où tous les sous-ensembles dont la somme est égale à la somme passée en argument sont renvoyés.
J'ai suivi une approche de programmation dynamique pour résoudre le problème et j'ai créé une fonction qui renvoie un tableau booléen bidimensionnel montrant quels sous-ensembles du tableau d'arguments ont une somme égale à la somme donnée. Chaque ligne représente un nombre dans le tableau d'arguments (la première ligne représente le premier élément, la deuxième ligne représente le deuxième élément, etc.); et chaque colonne représente une valeur de somme (la colonne la plus à gauche représente somme = 0
et la colonne la plus à droite représente la somme = "somme d'argument"). Si l'élément subsetArray[r][c] == true
, alors le sous-ensemble {array[0], array[1], ..., array[r]}
a des éléments qui s'additionnent à "c".
const subsetSum = (array, sum) => {
// Initialiser un tableau booléen 2D vide.
let subsetArray = new Array(array.length)
.fill(false)
.map(() => new Array(sum + 1).fill(false));
for (let e = 0; e < array.length; e++) {
for (let s = 0; s <= sum; s++) {
if (s === 0 || s === array[e]) {
subsetArray[e][s] = true;
continue;
}
if (e > 0) {
if (
subsetArray[e - 1][s] === true ||
subsetArray[e - 1][s - array[e]] === true
) {
subsetArray[e][s] = true;
}
}
}
}
return subsetArray;
};
Remarque: Cette fonction ne résout pas le problème. Elle fournit uniquement les sous-ensembles qui sont garantis d'inclure des sous-ensembles dont la somme est égale à la somme spécifiée.
Mon problème est que j'ai besoin d'extraire les sous-ensembles réels dont la somme est égale à la somme spécifiée de ce tableau booléen. J'ai essayé de le faire, mais la logique de mon approche (qui implique d'utiliser le tableau booléen pour réduire le nombre de sous-ensembles à analyser) devient plutôt compliquée et j'ai du mal à la mettre en œuvre.
Est-ce que quelqu'un connaît une bonne méthode pour trouver tous les sous-ensembles dont la somme est égale à la somme donnée lorsque l'on a le tableau booléen généré par subsetSum
?
Edit 1
Entrée
Somme: 17
Tableau : 7 2 1 5 1 20 7
Sortie
7 7 2 1