在某次面试的时候遇到的问题,如下:一千瓶药里只有一瓶有毒,一周后毒发。用10只老鼠试药,要怎样才能检测出有毒的那瓶药?
我一开始以为每只老鼠只能喝一瓶药,所以想了很久都没有想出来,后来参考:
http://bbs.csdn.net/topics/370210548
http://tieba.baidu.com/p/1662492456#
这个不错哦:http://dong008259.blog.163.com/blog/static/51645417201192911561141/
才想明白了。下面以3只老鼠检测8瓶药为例讲解:
每瓶药依次编号为000,001,010,011,100,101,110,111右边为低位
共有3只老鼠,第一只老鼠喝所有第一位(从右开始)为1的药,即喝第1,3,5,7瓶药;第二只老鼠喝所有第二位为1的药,即喝第2,3,6,7瓶药;第三只老鼠喝所有第三位(从右开始)为1的药,即第4,5,6瓶药。
一星期之后,如果某只老鼠死,标记为1,活标记为0。则如果第1只老鼠活,第2,3,只老鼠都死了,即110=6说明第6瓶要是毒药,其他都是无毒的。
因为第1只老鼠活的,而第一只老鼠只喝了1,3,5,7瓶药,说明第1,3,5,7瓶药是无毒的,第2,3,只老鼠是死的,而第2只老鼠只喝了2,3,6,7瓶,第3只老鼠只喝了4,5,6瓶,交集即为第6瓶药。所以第6瓶要是毒药。
易知,根据二进制编码,3只老鼠共可以编码2^3=8种,所以可以检测8种药。如果是10只老鼠,可以检查2^10=1024瓶药。