由于这个问题不是新问题,并且有很多算法可以解决,所以我认为这个问题可以重复,但是我没有找到任何问题。
有一组元素。任务是找到一个子集,其总和等于某个s
变量。
原始解决方案很简单,可以在指数时间内解决。 DP递归方法建议添加备忘录以降低复杂性或使用2D数组(自下而上)。
我在geeksforgeeks的评论中找到了另一个,但不明白它是如何工作的。
def is_subset_sum(a, s):
n = len(a)
res = [False] * (s + 1)
res[0] = True
for j in range(n):
i = s
while i >= a[j]:
res[i] = res[i] or res[i - a[j]]
i -= 1
return(res[s])
有人可以解释一下算法吗?数组的实际含义是什么?我正在尝试跟踪它,但无法处理。
答案 0 :(得分:1)
在代码中添加单词:依次尝试列表中的每个元素,将临时变量i
设置为目标总和。尽管i
不小于当前元素a[j]
,但等于i
当前值的总和是(1)已经可以到达并标记为是,或者(2)是可以到达的通过将当前元素a[j]
加到等于从我们可能已经标记的i
的当前值中减去当前元素的总和中。因此,我们列举了O(s * n)
时间和O(s)
空间中的所有可能性。 (i
对于该变量名可能不是一个好的选择,因为它最常见的是代表索引而不是总和。尽管在这种情况下,我们要检查的总和本身也是索引。)