組合總和 回溯演算法

2021-09-28 15:44:18 字數 2296 閱讀 5610

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的每個數字在每個組合中只能使用一次。

說明:所有數字(包括目標數)都是正整數。

解集不能包含重複的組合。

defcombinationsum

( candidates, target:

int)

: res=

; c_l=

len(candidates)

;def

find

(output,newtarget,i,c_l)

:sorted

(output):同乙個陣列,不同順序是一樣的

if newtarget==

0and

sorted

(output)

notin res:

sorted

(output));

return

; 用來跳過這一k;防止重複計算當前值

if i>=c_l:

return

; 防止重複計算上一步的值;從上一步的i的i+

1開始迴圈

for k in

range

(i,c_l)

: now=candidates[k]

new_target=newtarget-now;

if new_target>=0:

用來跳過這一k;防止重複計算當前值

find(output+

[now]

,new_target,k+

1,c_l)

find(

,target,

0,c_l)

;return res

candidates=[2

,3,6

,7,5

,6,1

];print

(combinationsum(candidates,7)

)[[2

,5],

[1,6

],[7

]]

candidates 中的數字可以無限制重複被選取。

defcombinationsum2

( candidates, target:

int)

: res=

; c_l=

len(candidates)

;def

find

(output,newtarget,i,c_l)

:if newtarget==

0and

sorted

(output)

notin res:

sorted

(output));

return

; # if i>=c_l:return;

for k in

range

(i,c_l)

: now=candidates[k]

new_target=newtarget-now;

if new_target >=0:

k為當前index,為了可以重複使用當前值

find(output+

[now]

,new_target,k,c_l)

find(

,target,

0,c_l)

;return res

candidates=[2

,3,6

,7,5

,1];

print

(combinationsum2(candidates,7)

)[[1

,2,2

,2],

[2,2

,3],

[1,1

,1,2

,2],

[1,1

,2,3

],[2

,5],

[1,1

,1,1

,1,2

],[1

,3,3

],[1

,1,1

,1,3

],[1

,6],

[7],

[1,1

,5],

[1,1

,1,1

,1,1

,1]]

演算法 回溯 組合總和3

找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 9 的正整數,並且每種組合中不存在重複的數字。說明 所有數字都是正整數。解集不能包含重複的組合。示例 1 輸入 k 3,n 7 輸出 1,2,4 示例 2 輸入 k 3,n 9 輸出 1,2,6 1,3,5 2,3,4 這段 組合總和...

演算法 回溯 貪心 組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...

組合總和(回溯)

思路 回溯法 剪枝法 相當不錯的題目,遞迴三部曲 1.遞迴什麼時候結束 當target為0時,遞迴結束 2.每個遞迴的返回值是什麼 每個遞迴結束後表示已經完成了後續的剪枝操作 3.每級遞迴中要做的事 遍歷選取當前要剪的那個枝,即把當前的所有的數字 枝 依次過一遍 依次壓入 彈出 如輸入 candid...