使用位运算枚举集合中所有的情况(辅助容斥原理)

枚举所有集合的情况可以用位运算来枚举

可以写成 for ( i = 1; i < k; i++ )

i看成一个二进制数,每个数有 \(logk\) 位,位数不足的话最高位补零。

如有 \(5\) 位,则 \(5\) 的二进制表示位 \(00101\)

如果当前位为零,说明当前位没有选,如果当前位为一,则说明这个位被选了

每个数都对应一种选法,所以可以遍历所有情况。

for ( i = 1; i < k; i++ )
{
    for ( int j = 0; j < log( k ); j++ )
    {
        if ( i >> j & 1 )
        {
            solve();
            if ( check() )
            {
                flag = true;
                break;
            }
        }
    }

    if ( flag ) option();
}
posted @ 2021-04-06 10:50  Jude_Zhang  阅读(75)  评论(0编辑  收藏  举报