3 回答

TA貢獻1842條經驗 獲得超13個贊
不是在每一步生成所有排列,而是維護每個排列總和的映射,然后在每次移動時向每個分支添加兩個分支。
將每個條目視為一組位,即對于每個排列,您可以包含或不包含給定的條目,例如,如果數字是 [7, 3, 2],您可以存儲 [1, 0, 1] 作為組合7 和 2。
您可以制作 101->9 等的哈希圖,當有人向其中添加 3 時,您可以為 1010->9 和 1011->12 添加一個條目。一旦你看到目標,你就知道游戲結束了。
所以 [7, 3, 2] 的演化將是
0->0
1->7
00->0
01->3
10->7
11->10
000->0
001->2
010->3
011->5
100->7
101->9
110->10
111->12

TA貢獻1875條經驗 獲得超5個贊
一種更有效的方法是只找到那些總和等于target15 的數字。
entry = [7, 5, 1, 3]
def is_sum_15(nums):
res = []
search_numbers(nums, 3, 15, 0, [], res)
return len(res) != 0
def search_numbers(nums, k, n, index, path, res):
if k < 0 or n < 0:
return
if k == 0 and n == 0:
res.append(path)
for i in range(index, len(nums)):
search_numbers(nums, k-1, n-nums[i], i+1, path+[nums[i]], res)
print(is_sum_15(entry)) # True

TA貢獻1815條經驗 獲得超13個贊
一種低效但簡單的方法是使用itertools.permutations:
>>> entry = [7, 2, 3, 5]
>>> import itertools
>>> [sum(triplet) for triplet in itertools.permutations(entry, r=3) if sum(tr]
[12, 14, 12, 15, 14, 15, 12, 14, 12, 10, 14, 10, 12, 15, 12, 10, 15, 10, 14, 15, 14, 10, 15, 10]
>>> any(sum(triplet) == 15 for triplet in itertools.permutations(entry, r=3))
True
這是低效的,因為每次entry用新數字擴展時你都會嘗試所有排列。
添加回答
舉報