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