У меня есть проблема с суммой подмножества, где вы можете добавлять или вычитать условия. Например, если у меня есть пять членов (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)
Я понимаю, что миллион вложенных циклов ужасно неэффективен, так что есть ли какие-то части, которые я могу ускорить с помощью лучшего алгоритма?