У меня есть проблема с подмножеством сумм, в которой вы можете добавить или вычесть условия. Например, если у меня есть пять членов (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)
Я понимаю, что миллион вложенных циклов ужасно неэффективен, поэтому есть ли какие-то детали, которые я могу ускорить с лучшим алгоритмом?
Поскольку у вас есть рабочее решение, вы будете делать все возможное, чтобы этот пост, чтобы вместо Просмотр Кода этого сайта: HTTP: //codereview.stackexchange.com/ –
Вы действительно хотите получить список всех решений или просто счет? –
@PatrickBeeson Я не согласен, у него есть рабочее решение, но оно медленное. Это объективная проблема, которую нужно решить. –