子集生成之二进制法

子集生成——二进制法  

/*算法思想
 例如求4个元素 3 2 1 0 的子集。
 那么用二进制的1代表每一位是否选中。
十进制 二进制
0   0000  代表空集
1   0001  代表{0}
2   0010  代表{1}
3   0011  代表{0,1}
4   0100  代表{2}
   ...
15   1110  代表{3,2,1}
16   1111  代表{3,2,1,0}

如果n很大的话可以用字符串模拟二进制
*/
# include <stdio.h>
# include <algorithm>
using namespace std;
//二进制法求子集
void print_subset(int n,int s){
 for(int i=0;i<n;i++){
  if(s & (1<<i)) //1左移i位,监测s的哪一位为1,为1的话输出
   printf("%d ",i);
 }
 printf("\n");
}
int main() {
 int n=3;
 for(int i=0;i<(1<<n);i++){//1左移n位等价于2^n-1.因为子集个数2^n-1
  print_subset(n,i);
 }
 return 0;
}



输出结果

0

0 1

2

0 2

1 2

0 1 2




十进制  二进制  子集合

0           0000     无

1           0001     {0}

2           0010     {1}

3           0011     {0},{1},{0,1}


猜你喜欢

转载自blog.csdn.net/qq_42390424/article/details/81051239
今日推荐