基本
问题描述
1000桶水,其中一桶有毒,毒水可以混合,猪喝毒水后会在15分钟内死去,想用15分钟找到这桶毒水,至少需要几头猪?
解法
这个提解法网上已经很多了,细节性的就不过多描述了,这里我只简单提下。这个题解法可以算是二进制
的一个巧用。猪有死和活两个状态,正好对应二进制的0和1。我们把1000只猪二进制编码。每头猪只喝当前bit为为1的水,如下表
Num. | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
… | … | … | … | … | … | … | … | … | … | … |
1000 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 |
1号猪喝1这列值是1的水,也就是第一桶+第三桶+…
2号猪喝1这列值是1的水,也就是第二桶+第三桶+…
以此类推…
然后我们可以轻松的计算得出编码10进制的1000桶,需要2n >= 1000, 可得n是10. 所以至少需要10头猪。
思考
扩展
原题15分钟毒发,并且给的时间限制也是15分钟,也就是说猪只能喝一次水。如果把时间限制放宽到30分钟,也就是猪能喝两次水。这个题接法又是什么? 刚刚运用了2进制,我们想当然可以想到,猪喝两次水,那就用3进制解决。然后就可以了,稍加思考一下会发现一个问题,假设猪在第一轮就死掉,那他就没办法参加第二次了。似乎3进制有点问题。再思考一下,我们可以发现这不是问题。3进制每位有0,1,2三个取值,对应到猪,就是没死,死了一次,死了两次,问题变成了如何定义“死两次”,我们可以把猪死亡记为1,第二轮死了猪还是死的,死亡计数加1. 通过调整一下编码和喝水时机,我们就可以用3进制解决这个问题。取值为2的第一轮喝,取值为1第二轮喝。正好对应死两次和死一次。
既然可以三进制,那么四进制,五进制。十进制。同理都是可以的。
数学
我们上面提到的都是解法,那换个解法的数学原理是什么。从二进制,一直到10进制乃至n进制。
我们总结发现,这其实是一个信息论的问题,一头猪所能提供的信息是它在什么时间死,因此能提供的信息量是-mlog(1/(1+n))。n为实验轮数,m为猪的数量。log(1/1000) = mlog(1/(1+n). 给定n求m,或者也可以给定m求n。
我们上面提到了2进制 3进制,只是符合的一种编码方式,也许 还有其他编码方式,也可以解决这个问题。这个就留待大神了。