如何用大小为sum + 1的数组解决子集和的问题

时间:2019-04-29 01:00:27

标签: python algorithm math

由于这个问题不是新问题,并且有很多算法可以解决,所以我认为这个问题可以重复,但是我没有找到任何问题。

有一组元素。任务是找到一个子集,其总和等于某个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])

有人可以解释一下算法吗?数组的实际含义是什么?我正在尝试跟踪它,但无法处理。

1 个答案:

答案 0 :(得分:1)

在代码中添加单词:依次尝试列表中的每个元素,将临时变量i设置为目标总和。尽管i不小于当前元素a[j],但等于i当前值的总和是(1)已经可以到达并标记为是,或者(2)是可以到达的通过将当前元素a[j]加到等于从我们可能已经标记的i的当前值中减去当前元素的总和中。因此,我们列举了O(s * n)时间和O(s)空间中的所有可能性。 (i对于该变量名可能不是一个好的选择,因为它最常见的是代表索引而不是总和。尽管在这种情况下,我们要检查的总和本身也是索引。)