- 题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
- 题解
使用深度优先搜索,注意candidates 中的数字可以无限制重复被选取
- 代码
class Solution {
public:
void dfs(vector<int>& candidates,vector<int>& tmp,int start,int sum,int target){
if (sum==target){
res.push_back(tmp);
return;
}
for (int i=start;i<candidates.size();i++){
for (int j=1;j<=(target-sum)/candidates[i];j++){
for (int k=0;k<j;k++) tmp.push_back(candidates[i]);
dfs(candidates,tmp,i+1,sum+candidates[i]*j,target);
for (int k=0;k<j;k++) tmp.pop_back();
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<int> tmp;
dfs(candidates,tmp,0,0,target);
return res;
}
vector<vector<int>> res;
};