二进制枚举有啥用?
代码短,比起dfs枚举还要快
怎么枚举的?
比如你有三个物品,你只需要从0枚举到2^3-1=7就可以了(dfs枚举我就不说了)
为什么呢?
0——7这几个数的二进制形式如下
0——000
1——001
2——010
3——011
4——100
5——101
6——110
7——111
你可以把1当作选这个物品,0代表不选这个物品。每一个位置上对应一个物品的选择
什么意思呢?
就比如2——010
我们就可以定义从左到右第一个位置对应1号物品的选与不选,从左到右第二个位置对应2号物品的选与不选,从左到右第三个位置对应3号物品的选与不选
那么2——010代表的意义就是第一个物品不选,第二个物品要选,第三个物品不选
而且从0——7的每一个数都具有这样的意义。那么可以说从0——(2^n)-1(n代表n个物品)这样枚举,这号可以把所有状态枚举到
一些位运算符
代码:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 7 { 8 9 int n; 10 11 cin >> n; 12 13 for(int i = 0; i < (1<<n); i++) //从0~2^n-1个状态 14 15 { 16 17 for(int j = 0; j < n; j++) //遍历二进制的每一位 18 19 { 20 21 if(i & (1 << j))//判断二进制第j位是否存在 22 23 { 24 25 printf("%d ",j);//如果存在输出第j个元素 26 27 } 28 29 } 30 31 printf("\n"); 32 33 } 34 35 return 0; 36 37 }
原文:https://www.cnblogs.com/kongbursi-2292702937/p/12110851.html