您的位置:首页 > 其它

leetcode子集和问题

2013-05-15 00:47 246 查看
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);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: