最簡單的方法是隻蠻力加號和減號的所有可能的組合,並返回第一個具有正確總和的那個。您可以使用itertools.product
來執行此操作。
import itertools
def find_correct_operators(seq, total):
signs = [-1,1]
for item_signs in itertools.product(*[signs]*len(seq)):
seq_with_signs_applied = [item*sign for item, sign in zip(seq, item_signs)]
sum(seq_with_signs_applied)
if sum(seq_with_signs_applied) == total:
return item_signs
a = [5,4,3,2,1]
b = 7
signs = find_correct_operators(a,b)
if signs is not None:
print "{} = {}".format(" ".join("{}{}".format("-" if sign == -1 else "+", item) for sign, item in zip(signs, a)), b)
else:
print "No solution found"
結果:
+5 -4 +3 +2 +1 = 7
這樣做的缺點是,它在O(2^N)時運行,所以它是非常不適合比說,二十項長期較大的任意序列。到那時,你正在遍歷超過一百萬種可能的組合。
編輯:如果你有一些限制大號和公式中沒有中間步驟可能永遠評估爲小於L比-L更大或更小,那麼你可以找到在O答案(N * L)時間,這是L.
的短小值有很大的改進
seq = [5,4,-3,2,1]
goal = 7
limit = 1000
d = {0: []}
for item in seq:
next_d ={}
for intermediary_total, path in d.iteritems():
for candidate in [-item, item]:
next_total = intermediary_total + candidate
if abs(next_total) <= limit:
next_d[next_total] = path + [candidate]
d = next_d
if goal in d:
print d[goal]
else:
print "no solution found"
結果:
[5, 4, -3, 2, -1]
這需要較少的假設。給我們一些示例數據並解釋你想要的。 – Teepeemm
解決了這個問題。 – DanielS21
我很想看到一個數學家的名字的定理... ..現在不記得了! – Onilol