二进制枚举//希望能帮到你

1.二进制,就无需解释了
2.枚举,其实就是列出所有的情况
接下来,我讲一下二进制与枚举结合:
首先我给一个示例:
皮特有个圆盘计时器,初始指在0的位置。给你一个长度为n的序列,执行n次旋转操作,可以是顺时针转ai度,也可以是逆时针转ai度。问能否执行n次操作后,指针还是指在0的位置

首先我们想象一下这个例子有多少种情况呢?
一个数有正负两种(即相当于顺时针,逆时针),那么有n个数字就会有2的n次方种情况。那我们首先得能列出所有情况,或则说写出能表示出所有情况的表达式,并且对于每种情况我们能做出判断;(看到 这里你可以先想一下应该如何解决)

其实以后看到有2的n次方种情况就可以去尝试一下用二进制枚举

好,回到正题:我们就假设一个数为正我们以1表示,为负就以0表示;
那么共有2的n次方种情况,无非就是这么多种0,1的排列方式咯!
我们就假设有共有8个数字,那么就共有2^8次方种情况(2的8次方二进制表示方式就是1<<8):
现在我们举一些情况:0000 0000;0101 0101;1111 1111;(例如00101001:其实就表示其中的第一个数字,第四个数字,第六个数字为正,其他的为负(从右往左数));
有这么多情况,我们就得需要用一个表达式表示出来
for(i=0;i<(1<<8);i++)
其实这个循环就写明了所有情况(如果你不明白的话你就把这个范围中任意一个i转换成二进制数,不正对应这些情况吗?(记住在这里把0,1看成数的正负)
既然我们列出这么多情况,那么我们得在对应情况去计算这些数字的总和。
for(i=0;j<(1<<8);i++)
{
all=0;
for(j=0;j<8;j++)
{
if(i&(1<<j))
all+=a[j];
else
all-=a[j]
}

}
//第一个循环是我们列出的情况,那我们就得在这种情况下去计算总和
而(i&(1<<j))就是根据情况,去计算。
那么(i&(1<<j)是什么意思呢,其表示 i的二进制的j+1个元素是不是1
就比如 当i=1时,其二进制表示0000 0001:那么当j=0时就是i的二进制表示第一个是不是1,对应过去是1,所以all+=a[j],当j=1时则是第二个,但第二个不是1,所以是all-=a[j]
这样计算了所有情况的数字总和

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值