核心就是求组和,求所有的组合,要求每个子集按序,所以要排序,但是不能再递归里对原来的数组排序,这样会破坏递归结构,所以要用一个临时变量解决。
void addSubsets(vector<int> &S,int n,int i,int k,vector<int> &res,vector<vector<int> >&ret)
{
if(k==0)
{
vector<int> temp(res);
sort(temp.begin(),temp.end());
ret.push_back(temp);
return;
}
if(i==n)
return;
res.push_back(S[i]);
addSubsets(S,n,i+1,k-1,res,ret);
res.pop_back();
addSubsets(S,n,i+1,k,res,ret);
}
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > ret;
vector<int> res;
ret.push_back(res);
int lenS = S.size();
for (int k=1;k<lenS;k++)
{
res.clear();
addSubsets(S,lenS,0,k,res,ret);
}
if(lenS!=0)
{
sort(S.begin(),S.end());
ret.push_back(S);
}
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<vector<int> >ret;
//ret = combine(5,3);
vector<int> S;
S.push_back(4);
//S.push_back(3);
S.push_back(1);
S.push_back(0);
ret = subsets(S);
vector<vector<int> >::iterator iter1=ret.begin();
vector<int>::iterator iter2;
while(iter1!=ret.end())
{
iter2 = iter1->begin();
while(iter2!=iter1->end())
{
cout<<*iter2<<" ";
iter2++;
}
cout<<endl;
iter1++;
}
system("pause");
return 0;
}