#include <iostream>
#include <algorithm>
using namespace std;
#define N 100000
int p[N];
int a[N];
//子集生成
void print_subset(int n, int *p, int *a ,int cur,int index)
{
if (cur != 0)
{
for (int i = 0; i < cur; i++)
cout << a[i] << " ";
cout << endl;
}
for (int j = index; j < n;j++)
{
a[cur] = p[j];
print_subset(n, p, a, cur + 1,j+1);
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> p[i];
print_subset(n, p, a, 0,0);
return 0;
}
2:位向量法
#include <iostream>
#include <algorithm>
using namespace std;
#define N 100000
int p[N];
int a[N];
//子集生成
void print_subset(int n, int *p, int *a ,int cur)
{
if (cur == n)
{
for (int i = 0; i < cur; i++)
if(a[i]) cout << p[i] << " ";
cout << endl;
return;
}
a[cur] = 1;
print_subset(n, p, a, cur + 1);
a[cur] = 0;
print_subset(n, p, a, cur + 1);
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> p[i];
print_subset(n, p, a, 0);
return 0;
}
3:二进制法(最简洁的方法)
#include <iostream>
#include <algorithm>
using namespace std;
#define N 100000
int p[N];
int a[N];
//子集生成
void print_subset(int n, int *p)
{
for (int i = 0; i < (1 << n); i++)\
{
for (int j = 0; j < n; j++)
if (i&(1 << j)) cout << p[j] << " ";
cout << endl;
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> p[i];
print_subset(n,p);
return 0;
}