这个使用了回溯算法,一般就是要画数形图,然后通过深度优先遍历,找到所有可能的列表,并判断是否满足题目结果
在本题目中,第一次学会使用该方法,先排序(这一目的是为了做剪枝优化,然后每次的开始是从本值开始的,这样为了除去重复值
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
vector<int> path;
sort(candidates.begin(),candidates.end());
if(candidates.size()==0){
return res;
}
int len =candidates.size();
dfs(candidates,target,0,len,path,res);//调用函数
return res;//返回结果
}
void dfs(vector<int>& candidates,int target,int begin,int len,vector<int>& path,vector<vector<int>>& res){//传入 数组,目标值,起始位置,长度,路径,结果
if(target==0){
res.push_back(path);
return;
}
for(int i=begin;i<len;i++){
if(target<candidates[i]){
break;
}
path.push_back(candidates[i]);//加入
dfs(candidates,target-candidates[i],i,len,path,res);//要从这个数开始,而不是开头开始
path.pop_back();//删除
}
}
};