Combination Sum
回溯法应用
数组不含重复元素,结果可含重复元素。回溯法。
自己写的代码:
class Solution { public: vector<vector<int>>v; vector<int>v1; int sum; vector<vector<int> > combinationSum(vector<int> &candidates, int target) { sort(candidates.begin(),candidates.end()); v.clear(); sum=0; backtrace(candidates,target,0); sort(v.begin(),v.end()); return v; } void backtrace(vector<int> &candidates, int target,int dep) { if(sum==target) { if(count(v.begin(),v.end(),v1)==0)v.push_back(v1); } if(dep==candidates.size()) return; if(dep<candidates.size()) { int j=(target-sum)/candidates[dep]; for(int i=0;i<j;i++)/可加入j次 { sum+=candidates[dep]; v1.push_back(candidates[dep]); backtrace(candidates,target,dep+1); } for(int i=0;i<j;i++) { sum-=candidates[dep]; v1.pop_back(); } backtrace(candidates,target,dep+1);//不包含此元素时 } } };
给出的集合里有重复元素,但每一个元素只能用一次
class Solution { public: vector<vector<int>>v; vector<int>v1; int sum; vector<vector<int> > combinationSum2(vector<int> &candidates, int target) { sort(candidates.begin(),candidates.end()); v.clear(); sum=0; backtrace(candidates,target,0); sort(v.begin(),v.end()); return v; } void backtrace(vector<int> &candidates, int target,int dep) { if(sum==target) { if(count(v.begin(),v.end(),v1)==0)v.push_back(v1); } if(dep==candidates.size()) return; if(dep<candidates.size()&&sum<target) { sum+=candidates[dep]; v1.push_back(candidates[dep]); backtrace(candidates,target,dep+1); sum-=candidates[dep]; v1.pop_back(); backtrace(candidates,target,dep+1); } } };