对于某些一个事物的两种状态的枚举(一个东西有,没有;一个数选还是没选。。。)
这种题的枚举我们就可以用二进制枚举来解题
对于一个集合a{1,2,3,4},如果我们想枚举出所以只有2个元素的子集,那么我们就可以用二进制枚举出1010,0011,1001.....
1 | 0 | 1 | 0 |
1 | 未选择 | 3 | 未选择 |
0 | 0 | 1 | 1 |
未选择 | 未选择 | 3 | 4 |
上面的表格就是二进制1010枚举的对应子集{1,3},0011枚举对应的子集{0,0,3,4}
1表示选择了,0表示没选择;
用代码表示:
for(int i=0 ; i<(1<<n) ; i++){//这里实现的是n个数的所以选取情况,上面例子中,的n就应该=4,会生成所以的子集选取情况 for(int j=0 ; j<n ; j++){ if(j&(1<<j)){ .... } else{ .... } } }