求数字1,2,n 的所有子集,用一个数组position来保存每次要回溯时的位置,而且每次前进时的位置起点为上一次位置的后一个位置开始。
#include <iostream>
#include <vector>
#define MAX 4
using namespace std;
vector<int> vec{1,2,3,4};
vector<int> ans; //保存结果
vector<int> position(n,-1);//保存每次回溯时的位置
void print(vector<int> &v)
{
cout<<"{ ";
for(auto x:v)
cout<<x<<' ';
cout<<'}'<<endl;
return;
}
void huisu()
{
int k=0;
while(k>=0)
{
while(position[k]<MAX-1)
{
position[k]+=1;
ans.push_back(vec[position[k]]);
print(ans);
if(k==MAX-1)
{
ans.pop_back();
break;
}
++k;
position[k] = position[k-1];
}
ans.pop_back();
--k;
}
cout<<"{ }"<<endl;
}
int main(int argc, char** argv)
{
huisu();
return 0;
}