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);
}
}
};