3
我想知道最高效(時間和記憶)的方法來計算總和小於或等於某個限制的子集的數量。例如,對於集合{1, 2, 4}
和極限3
,這樣的數字應該是4(子集是{}, {1}, {2}, {1, 2}
)。我想在一個位向量(掩模)編碼一子集,並在下列方式找到答案(僞碼):0-1揹包的計數組合
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)
陣列是基於零的,計數可以是一個全局變量和visited
是陣列長度爲2^n
。我明白這個問題具有指數級的複雜性,但是對我的想法有更好的方法/改進嗎?該算法運行速度快爲n ≤ 24
,但我的方法是非常蠻力的,並且我正在考慮存在一些巧妙的方法來找到n = 30
的答案。