Je travaille sur ce code (crédits à Shreyanshi Arun pour le code de base) qui imprime les sommes de tous les sous-ensembles d'un ensemble donné: J'essaie de l'adapter à recevoir Un compte Par exemple, dans ce code, le résultat est comme celui-ci: 19.0 14.0 14.0 9.0 16.0 11.0 11.0 6.0 17.0 12.0 12.0 [...]
Combinations: 256
3 Réponses :
créer un ensemble pour contenir toutes les sommes. Ajoutez chaque somme à l'ensemble et à la fin de la longueur de l'ensemble sera le nombre de sommes différentes.
def subsetSums(arr, l, r, sum=0, allSums = None): if allSums is None: allSums = set() # Print current subset if l > r: allSums.add(sum) print(sum,end=" ") return len(allSums) # Subset including arr[l] subsetSums(arr, l + 1, r, sum + arr[l], allSums) # Subset excluding arr[l] return subsetSums(arr, l + 1, r, sum, allSums) arr = [0.5, 0.5, 1.5, 1.5, 2, 3, 5, 5] n = len(arr) k = subsetSums(arr, 0, n - 1)
Parfait! Merci beaucoup.
Une meilleure approche ici pourrait conserver une table de hash pour vérifier les sommes déjà apparues
def subsetSums(arr, l, r,sum=0): # Print current subset if l > r: global k global sumHash print(sum, end=" ") if(sum not in sumHash): k += 1 sumHash[sum] = True return # Subset including arr[l] subsetSums(arr, l + 1, r,sum + arr[l]) # Subset excluding arr[l] subsetSums(arr, l + 1, r, sum) k = 0 sumHash = dict() arr = [0.5, 0.5, 1.5, 1.5, 2, 3, 5, 5] n = len(arr) subsetSums(arr, 0, n - 1) print("\n Combinations:", k)
Au lieu de suivre toujours les 2 sous-sols n sup>, je construirais simplement l'ensemble des sommes telles que ceci: >>> len(reduce(lambda sums, x: sums | {s + x for s in sums}, arr, {0}))
39
Peut-être essayer d'ajouter du résultat à l'ensemble, vous pouvez utiliser la longueur de définie comme nombre de combinaisons