回溯
</pre><pre code_snippet_id="1616450" snippet_file_name="blog_20160319_6_4200402" name="code" class="html">
</pre><pre code_snippet_id="1616450" snippet_file_name="blog_20160319_6_4200402" name="code" class="html">
class Solution {
public:
void combinate(vector<vector<int> > &res, vector<int> plan, vector<int> &candidates, int target)
{
//target==0,找到目标,返回
if(!target){
res.push_back(plan);
return;
}
//返回上一级
if(target<0){
return;
}
for(int j=0;j<candidates.size();j++){
//因为是排过序的,所以只需要在找后面的,比前面大的
if(candidates[j]>=plan[plan.size()-1]){
plan.push_back(candidates[j]);
combinate(res,plan,candidates,target-candidates[j]);
plan.pop_back();
}
}
}
vector<vector<int> > combinationSum(vector<int>& candidates, int target)
{
vector<vector<int> > res;
vector<int> plan;
sort(candidates.begin(),candidates.end());
for(int i=0;i<candidates.size();i++){
plan.clear();
plan.push_back(candidates[i]);
combinate(res,plan,candidates,target-candidates[i]);
}
return res;
}
};