題目:
1.在上乙個「組合總和」中,每個元素可選擇無數次,這個題裡面,乙個元素只能選一次。
2. 上乙個題裡,元素都不重複,這個題,元素可重複。
思路:和上一題差不多,回朔法。先排序。假如給出的數1,2,2,2。target==5;因為每個數只能選一次,所以要有乙個陣列visited,數值為1,說明這個下標代表的數已經選過了。不能再選。
第一輪,1加入tmp,之後visited[0]=1。遞迴呼叫。遞迴時,雖然start依然為0,但是,visited[0]==1,已經被訪問過,所以不會再被訪問,2被加入。。。最後,得出包含「1」的結果。別忘了回溯時,要把tmp裡加入的元素踢出來,visited也要設定為0,因為在一輪迴圈裡,可能訪問過陣列裡所有的元素,但是下一輪迴圈,start加一之後,如果沒有設定為0的操作,這個數就無法訪問了
第二輪迴圈:1被踢出去,從2開始,2加入tmp,visited[1]=1。遞迴呼叫,找出包含2的結果。。。
補充,因為解集裡不能包含重複元素,res裡加入tmp時,要用res.contains(tmp);判斷tmp這個集合,是否已經在res裡面。
class solutionpublic void backpack(list> res,int candidates,int target,int i,listtmp,int visited)//i是搜尋起點的下標,因為數字可以重複選取,下一層的結點從這個搜尋起點開始搜尋;這個起點之前的一定被搜尋過了,所以不需要
if(target<0) return;
for(int start=i;start}}
40 組合總和
給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。class solution retur...
40 組合總和 II
給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。示例 1 輸入 candidates 1...
40 組合總和 II
給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。示例 1 輸入 candidates 1...