[acm]二进制枚举

 

对于某些一个事物的两种状态的枚举(一个东西有,没有;一个数选还是没选。。。)

这种题的枚举我们就可以用二进制枚举来解题

对于一个集合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{
            ....
        }
    }
}    

 

  

 

 

posted @ 2020-03-27 11:05  Hoppz  阅读(196)  评论(0编辑  收藏  举报