【发布时间】:2012-04-06 06:08:51
【问题描述】:
考虑这种解决子集和问题的方法:
def subset_summing_to_zero (activities):
subsets = {0: []}
for (activity, cost) in activities.iteritems():
old_subsets = subsets
subsets = {}
for (prev_sum, subset) in old_subsets.iteritems():
subsets[prev_sum] = subset
new_sum = prev_sum + cost
new_subset = subset + [activity]
if 0 == new_sum:
new_subset.sort()
return new_subset
else:
subsets[new_sum] = new_subset
return []
我从这里得到它:
http://news.ycombinator.com/item?id=2267392
还有一条评论说可以让它“更高效”。
怎么做?
另外,有没有其他方法可以解决这个问题,至少和上面的一样快?
编辑
我对任何可以加快速度的想法都感兴趣。我发现:
https://en.wikipedia.org/wiki/Subset_sum_problem#cite_note-Pisinger09-2
其中提到了线性时间算法。但是我没有那张纸,也许你们,亲爱的人们,知道它是如何工作的吗?也许是一个实现?也许完全不同的方法?
编辑 2
【问题讨论】:
-
可以下载论文from here。
-
真的是同一张纸吗?他们有不同的头衔..?
-
摘要声称“将动态规划算法限制为仅考虑平衡状态,这意味着子集-子问题 [...] 可以在线性时间内解决,前提是系数受常数限制.",这就是我认为您正在寻找的内容。
-
除非 P=NP,否则没有线性时间算法,因为子集和是 NP 完全的。您的算法和我的答案是线性时间,当权重有界时 - 这意味着子集数组中只有 O(activities.size() * 2^bound) 个可能的元素。
-
@maniek 自言自语——因为我不能再编辑评论了。大小实际上是 O(activities.size() * bound),而不是 O(activities.size() * 2^bound)
标签: algorithm subset-sum