조건을 더하거나 뺄 수있는 부분 집합 합계 문제가 있습니다. 나는 다섯 개 가지 측면이있는 경우 예를 들어, (1, 2, 3, 4, 5), 나는 7을 만들기 위해/I 추가 할 수있는 몇 가지 방법을 알고 조건을 빼기하려면 :뺄셈을 사용한 부분 집합 합계 알고리즘
- 3 + 4
- + 2 + 4
- 5 2 + 5
- 1-2 + 4
- 등
파이썬에서 일부 코드를 작성하지만, 한 번 많은 용어가 매우 느립니다 :
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.stackexchange.com/ –
실제로 모든 솔루션 목록을 원하십니까? –
@PatrickBeeson 나는 동의하지 않는다. 그는 일하는 해결책이 있지만 느리다. 이것은 해결되어야 할 객관적인 문제입니다. –