Trouver toutes les combinaisons d'une liste de nombres avec une somme donnée
J'ai une liste de nombres, par exemple
numbers = [1, 2, 3, 7, 7, 9, 10]
Comme vous pouvez le voir, les chiffres peuvent apparaître plus d'une fois dans cette liste.
J'ai besoin d'obtenir toutes les combinaisons de ces numéros qui ont une somme donnée, par exemple 10
.
Les éléments dans les combinaisons ne peuvent pas être répétées, mais chaque élément dans numbers
doit être traitée de façon unique, ce qui signifie, par exemple les deux 7
dans la liste représentent les différents éléments avec la même valeur.
L'ordre est sans importance, de sorte que [1, 9]
et [9, 1]
sont de la même combinaison.
Il n'y a aucune restriction de longueur pour les combinaisons, [10]
est aussi valide que [1, 2, 7]
.
Comment puis-je créer une liste de toutes les combinaisons répondant aux critères ci-dessus?
Dans cet exemple, il serait [[1,2,7], [1,2,7], [1,9], [3,7], [3,7], [10]]
OriginalL'auteur Byte Commander | 2015-12-29
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser itertools pour parcourir chaque combinaison de chaque taille possible, et de filtrer tout ce qui n'a pas de somme à 10:
Résultat:
Malheureusement, c'est quelque chose comme O(2^N) la complexité, de sorte qu'il n'est pas approprié pour la saisie des listes de plus de, disons, 20 éléments.
OriginalL'auteur Kevin
La la solution de @kgoodrick offert est grande, mais je pense qu'il est plus utile en tant que générateur:
list(subset_sum([1, 2, 3, 7, 7, 9, 10], 10))
rendements[[1, 2, 7], [1, 2, 7], [1, 9], [3, 7], [3, 7], [10]]
.Ce serait le moment de la complexité de ce code?
OriginalL'auteur Martin Valgur
Cette question a été posée, voir @msalvadores réponse ici. J'ai mis à jour le code python donné à exécuter en python 3:
OriginalL'auteur kgoodrick