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