使用位运算枚举集合中所有的情况(辅助容斥原理)
枚举所有集合的情况可以用位运算来枚举
可以写成 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();
}
作者:Jude_Zhang
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!