题目:求一个数组的所有子集。
如int a[]={1,2,3}.其子集为有2^n=8 它们是:{},1,2,3,12,13,23,123
分析:
我们可以使用二进制位标记来做。子集中有某个字符用1标记,不存在用0标记,则:
000 {}
001 c
011 bc
100 a
101 ac
110 ab
111 abc
则我们可以遍历数值0~2^n-1,每个数代表一个子集,而这个数的二进制位是1的代表原数组中的字符要取,否则不取;另外注意还有一个空集也是一个子集。
#include <vector>
void subset(int a[], int n)
{
int count = 1 << n;//子集个数
//遍历[0,count),这里面的每一个数的二进制位就代表一个子集(比如2的二进制位是010,则子集就是b)
for (int i = 0; i < count; i++)
{
int flag = 1;//用来处理空集的
//对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 << a[j] << " ";
}
}
if (flag == 1)
cout << "{}";
cout << endl;//每输出一个子集,就换行
}
}