- 毒药问题:
大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?
这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0 ⋯⋯每只老鼠的死活都能确定出 10 位二进制数的其中一位,由此便可知道毒药瓶子的编号了。
示意图:
假设有8个瓶子,里面只有一瓶是毒药,外观与其他7瓶一致,老鼠吃下毒药后1个小时会死亡,问要多少只老鼠才能够才一个小时内找出哪一瓶是毒药?具体怎么操作?
一只老鼠有两种状态:1.生存、2.死亡
2^3 = 8,所以用3只老鼠就可以
具体怎么操作呢?
Step1:首先用0-7把8个瓶子编号,然后把10进制的编号转换为二进制数
Setp2:把三只老鼠分别编号为1、2、3,编号为1的老鼠吃上二进制位第一位为1的编号的毒药,编号为2的老鼠就吃上二进制位第二位为1的毒药,编号为3的老鼠就吃上二进制位第三位为1的毒药,然后毒药分配就如下
编号1老鼠(1-3-5-7)、编号2老鼠(2-3-6-7),编号3老鼠(4-5-6-7)
!假设编号为5(101)的瓶子有毒
下面分析结果:
如果1号老鼠死了(老鼠1),则表明毒药存在于编号二进制中第一位为1的瓶子,那么毒瓶子的编号为(XX1),X表示尚未确认
然后分析第二只老鼠,如果第二只老鼠(老鼠2)没死,那就说明毒药瓶子不存在于编号二进制中第二位为1的瓶子,即毒药编号为(X01)
最后分析第三只老鼠,如果老鼠3死了,那就表名毒药存在于编号二进制位中第三位为1的的瓶子之中,即编号为(101)
最后得出结论:编号为101的瓶子有毒
假如三只老鼠都没有死亡,则表明有毒的瓶子是0号瓶子