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
的答案。