二进制:所谓的二进制,就是逢二进一的计数方法。我们计算机能识别的也都是二进制数,也就是最常见的01串。
枚举:就是例举出所有的情况。
二进制枚举:我们都知道二进制数是只有0和1构成,在c语言中1代表真,0代表假。对于01数列,我们可以认为1代表取用,0代表不取用。
举例:假设我们要求出某个集合的所有子集。我们可以二进制枚举的方法,一共有 1<<n 个子集,所以列出1到(1<<n)的所有二进制数,这里的每个数就是对应的每个集合。然后用过&运算的方式,判断所有的位上是1还是0,通过&上(1<<m),判断m位上是1,还是0,如果m位上是0,那结果是0,如果m上是1,结果是1.
注释:上述讲述中牵扯位运算的知识,不了解的可以先去了解一下位运算。
#include<bits/stdc++.h>
using namespace std;
void print_subset(int n,int s){
for(int i = 0 ; i < n ; i++)
if(s&(1 << i))
printf("%d",i);
printf("\n");
}
int main(){
while(1){
int n;
cin >> n;
for(int i = 0 ; i < (1 << n) ; i++)
print_subset(n,i);
}
return 0;
}