给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
示例 1:
示例 2:
//当sum≥targetSum就可以返回了
if(sum>=targetSum){
if(sum==targetSum) result.push_back(path);
return;
}
我们通过for循环来控制横向遍历,通过控制递归函数来实现纵向遍历,不过这里的纵向遍历可就不是i+1了,而是i,这里一定要想清楚,因为这道题说一个元素是可以重复选取的!!!所以说纵向遍历的时候,是可以包括当前遍历的元素的,在代码体现上也就是递归函数的参数startindex==i,而不是i+1。
明白了这个之后,我们不难写出代码:
for(int i=startindex;i<candidates.size();i++){
sum+=candidates[i];
path.push_back(candidates[i]);
//这里是i,并不是i+1,因为同一个元素可以重复取
backtracking(candidates,targetSum,sum,i);
sum-=candidates[i];
path.pop_back();
}
for(int i=startindex;i<candidates.size();i++){
path.push_back(candidates[i]);
//将回溯过程隐藏在递归函数当中
backtracking(candidates,targetSum,sum+candidates[i],i);
path.pop_back();
}
class Solution {
public:
vector<int> path;
vector<vector<int> > result;
void backtracking(vector<int> candidates,int targetSum,int sum,int startindex){
if(sum>=targetSum){
if(sum==targetSum) result.push_back(path);
return;
}
for(int i=startindex;i<candidates.size();i++){
//使用sum加减更直观,也可以隐藏到回溯函数当中。
sum+=candidates[i];
path.push_back(candidates[i]);
//这里是i,并不是i+1,因为同一个元素可以重复取
backtracking(candidates,targetSum,sum,i);
sum-=candidates[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
path.clear();result.clear();
if(candidates.size()==0) return result;
backtracking(candidates,target,0,0);
return result;
}
};