//求一个数组的子集
#include <vector>
#include<iostream>
using namespace std;
vector<vector<int>>A;
void subset(int a[], int n)
{
int count = 1 << n;//子集个数 左移就相当于乘以2
//遍历[0,count),这里面的每一个数的二进制位就代表一个子集(比如2的二进制位是010,则子集就是b)
for (int i = 0; i < count; i++)
{
int flag = 1;//用来处理空集的
vector<int> temp;
//对i的二进制进行分析,分析n位(因为有n个元素,只需要n个比特位)
for (int j = 0; j < n; j++)
{
//取i的第0,1,...n-1位的比特位
if ((1 << j)&i)//比特位是1,就输出对应的元素
{
flag = -1;//说明至少有一个位是1
/**
cout<<"j="<<j<<endl;
cout << a[j] << " ";
*/
temp.push_back(a[j]);
}
}
if(temp.size()>0)
A.push_back(temp);
if (flag == 1)
cout << "{}";
}
}
int main(){
int arr[]={3,2,1};
subset(arr, 3);
for(int i=0;i<A.size();i++){
for(int j=0;j<A[i].size();j++){
cout<<A[i][j]<<" ";
}
cout<<endl;
}
//int count=1>>1;
// cout<<count<<endl;
return 0;
}