【发布时间】:2015-01-31 03:32:32
【问题描述】:
我有一个子集和问题,您可以在其中添加或减去项。例如,如果我有五个项(1、2、3、4、5),我想知道我可以通过多少种方式添加/减去这些项来得到 7:
- 3 + 4
- 2 + 5
- 1 + 2 + 4
- 5 - 2 + 4
- 等
我用Python写了一些代码,但是一旦有很多术语就很慢:
import itertools
from collections import OrderedDict
sum_answer = 1
terms = {"T1": 1, "T2": -2, "T3": 3, "T4": -4, "T5": 5}
numlist = [v for v in terms.values()]
zerlist = [x for x in itertools.repeat(0, len(numlist))]
opslist = [item for item in itertools.product((1, -1), repeat=len(numlist))]
res_list = []
for i in range(1, len(numlist)):
combos = itertools.combinations(numlist, i)
for x in combos:
prnlist = list(x) + zerlist[:len(numlist) - len(x)]
for o in opslist:
operators = list(o)
result = []
res_sum = 0
for t in range(len(prnlist)):
if operators[t] == 1:
ops = "+"
else:
ops = "-"
if prnlist[t] != 0:
result += [ops, list(terms.keys())[list(terms.values()).index(prnlist[t])]]
res_sum += operators[t] * prnlist[t]
if sum_answer == res_sum:
res_list += [" ".join(result)]
for ans in OrderedDict.fromkeys(res_list).keys():
print(ans)
我意识到一百万个嵌套循环非常低效,那么我可以使用更好的算法来加速任何部分吗?
【问题讨论】:
-
既然你有一个可行的解决方案,你最好把它发布到 CodeReview 而不是这个网站:codereview.stackexchange.com
-
您真的想要一个所有解决方案的列表,还是只是一个计数?
-
@PatrickBeeson 我不同意,他有一个可行的解决方案,但速度很慢。这是一个有待解决的客观问题。
-
@HughBothwell:目的是尝试找出数据库中的哪些字段用于计算报表的总计,所以我需要所有解决方案。
标签: python algorithm subset-sum