34 組合總和

2021-10-09 17:15:40 字數 1308 閱讀 3922

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

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

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

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

示例 1:

輸入:candidates = [2,3,6,7], target = 7,

所求解集為:

[7],

[2,2,3]

輸出:2

示例 2:

輸入:candidates = [2,3,5], target = 8,

所求解集為:

[2,2,2,2],

[2,3,3],

[3,5]

輸出:3

可使用以下main函式:

int main()

int n,data,target;

vectorcandidates;

cin>>n;

for(int i=0; icin>>data;

candidates.push_back(data);

cin>>target;

vector> res=solution().combinationsum(candidates,target);

cout對於這類尋找所有可行解的題,我們都可以嘗試用「搜尋回溯」的方法來解決。

回到本題,我們定義遞迴函式 dfs(target, combine, idx) 表示當前在 candidates 陣列的第 idx 位,還剩 target 要組合,已經組合的列表為 combine。遞迴的終止條件為 target <= 0 或者 candidates 陣列被全部用完。那麼在當前的函式中,每次我們可以選擇跳過不用第 idx 個數,即執行 dfs(target, combine, idx + 1)。也可以選擇使用第 idx 個數,即執行 dfs(target - candidates[idx], combine, idx),注意到每個數字可以被無限制重複選取,因此搜尋的下標仍為 idx。

class solution 

if (target == 0)

// 直接跳過

dfs(candidates, target, ans, combine, idx + 1);

// 選擇當前數

if (target - candidates[idx] >= 0)

}vector> combinationsum(vector& candidates, int target)

};

34 組合總和

34 組合總和 問題描述 給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合,輸出組合的數量。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包...

39 組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2...

39 組合總和

給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 示例 2 ...