问题描述
思路
看题目,明白要枚举所有可能的情况,,就可以使用递归
最最重要的一点就是画出树状图,根据树状图敲代码就像依葫芦画瓢
代码
class Solution {
vector <vector <int> > res;//存放总结果的数组
vector <int> p;//存放临时结果的数组
int sum(vector <int> a)//求和函数,求数组a中的所有元素之和
{
int s=0;
for(int i=0;i<a.size();i++) {
s+=a[i];
}
return s;
}
void dfs(vector <int> &candidates,int target,int t,int start,vector <int> p)
{//t代表t与target的差值,start代表从什么位置开始
if(t==0) {//套路,终止条件
res.push_back(p);
}
for(int i=start;i<candidates.size();i++) {//自己画出树状图,有多少分支就有多少递归函数,也就是循环几次
p.push_back(candidates[i]);//将当前元素储存在p中
if(sum(p)>target) {//如果加上这个元素,总和比target大,就直接返回
return;
}
dfs(candidates,target,t-candidates[i],i,p);
p.pop_back();//回溯时,p应该删去刚刚加入的元素
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());//题目给的数组可能是乱序的,这一步的操作是为了递归是start更方便
dfs(candidates,target,target,0,p);
return res;
}
};