#include
#include
#include
int printSubsequences(int arr[], int len)
{
unsigned int opsize = pow(2, len);
int cnt;
int j;
for (cnt = 0; cnt < opsize; cnt++)
{
printf("{ ");
for (j = 0; j < len; j++) {
if (cnt & (1 << j)) {
printf("%d ", arr[j]);
}
}
printf("}\n");
}
return 0;
}
int main(int argc, char *argv[])
{
int arr[] = {1, 2, 3};
int len = sizeof(arr) / sizeof(arr[0]);
printSubsequences(arr, len);
return 0;
}
输出结果:
{ }
{ 1 }
{ 2 }
{ 1 2 }
{ 3 }
{ 1 3 }
{ 2 3 }
{ 1 2 3 }
原理:
数组元素个数 为 3 ,那么 全部子集有 2**3 = 8 个, 使用 位图表示,其中 位为 1 表示数组下标对应的位置。
0 0 0 => { }
0 0 1 => { 1 }
0 1 0 => { 2 }
0 1 1 => { 1, 2}
1 0 0 => { 3 }
1 0 1 =>{1 , 3}
1 1 0 => {2 , 3}
1 1 1 => {1, 2, 3}