算法 - 查找总和在给定范围内的子集数

时间:2016-12-27 14:41:45

标签: algorithm subset

这是一个面试问题。我给出了一系列数字(重复数,可能的负数)以及范围的下限和上限。我需要找到可能的子集数量,它们将总和到该范围内的数字。我确实查看了寻找特定金额的问题(find all subsets that sum to a particular value),但我不认为尝试为该范围内的每个数字做这个是最有效的事情。

范围可以是-10 ^ 7到10 ^ 7.

1 个答案:

答案 0 :(得分:1)

可以修改子集和的经典DP来解决这个问题,保持计数而不是布尔指示符来确定是否存在具有给定和的解。

def subset_sum_count(lst, a, b):
    sum_count = collections.Counter({0: 1})
    for x in lst:
        for s, c in list(sum_count.items()):
            sum_count[s + x] += c
    return sum(c for (s, c) in sum_counts.items() if a <= s <= b)