### 題目
給定一個無重複元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和爲 target 的組合。
candidates 中的數字可以無限制重複被選取。
說明:
所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: candidates = [2,3,6,7], target = 7,
所求解集爲:
[
[7],
[2,2,3]
]
示例 2:
輸入: candidates = [2,3,5], target = 8,
所求解集爲:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
### 思路
依然是利用回溯法,設置一個數組temp用來存儲數字組合,首先將candidates的第一個數字放進temp當中,然後再在candidates中尋找下一個放入temp當中的數字,然後再將target減去放入的數字 這裏注意,因爲可以重複,所以依然是可以將candidates的第一個數字放入,然後依次這樣放入數字,直到target等於0,證明找到了一個合理的組合,添加入最後結果當中。
### code
class Solution {
public:
void add(int index,vector<int>& candidates,vector<int>& temp,int target,vector<vector<int>>& res)
{
if(target<=0)
{
if(target==0)
{
res.push_back(temp);
}
return ;
}
// cout<<1;
for(int i=index;i<candidates.size();++i)
{
temp.push_back(candidates[i]);
add(i,candidates,temp,target-candidates[i],res);
temp.pop_back();
}
//cout<<2;
return ;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>>res;
vector<int>temp;
add(0,candidates,temp,target,res);
return res;
}
};