我想知道计算子集和小于或等于某个限制的数量的最有效(时间和内存)的方式是什么。例如,对于集合{1,2,4}
和限制3
,这样的数字应该是4(子集为{}, {1}, {2}, {1, 2}
)。我尝试使用位向量(掩码)编码子集,并以以下方式查找答案(伪代码):
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)
数组是以0为基础的,计数可以是全局变量,并且visited
是长度为2^n
的数组。我知道这个问题具有指数复杂度,但是否有更好的方法/改进我的想法?该算法对于n≤24
运行速度很快,但我的方法相当暴力,我在思考是否存在一些聪明的方法来找到例如n=30
的答案。