Ich frage mich, was ist die effizienteste (Zeit und Speicher) Weg, um die Anzahl der Teilmengen mit der Summe kleiner oder gleich als ein Limit zu zählen. Zum Beispiel für die Menge {1, 2, 4}
und die Grenze 3
sollte eine solche Zahl 4 sein (Teilmengen sind {}, {1}, {2}, {1, 2}
). Ich habe versucht ein Teilmengen in einem Bit-Vektor-Codierung (Maske) und eine Antwort auf folgende Weise zu finden (Pseudocode):Count-Kombinationen für 0-1 Rucksack
solve(mask, sum, limit)
if visited[mask]
return
if sum <= limit
count = count + 1
visited[mask] = true
for i in 0..n - 1
if there is i-th bit
sum = sum - array[i]
mask = mask without i-th bit
count (mask, sum, limit)
solve(2^n - 1, knapsack sum, knapsack limit)
Arrays sind nullbasiert, Zählung eine globale Variable sein kann und visited
ist ein Array von Länge 2^n
. Ich verstehe, dass das Problem eine exponentielle Komplexität hat, aber gibt es eine bessere Annäherung/Verbesserung meiner Idee? Der Algorithmus läuft schnell für n ≤ 24
, aber mein Ansatz ist ziemlich brutal und ich dachte über die Existenz eines cleveren Weg, um eine Antwort für n = 30
zum Beispiel zu finden.