老鼠试毒问题
问题描述:
有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。给你一星期的时间,问最少使用多少只小白鼠能够检测出哪一瓶有毒。
正确答案:
10只,我们只需要10只就能测出哪一瓶有毒。
原理:
简单原理解释,主要是使用位的思想来解决这个问题。 1000最少可以用2^10来表示,我们可以用10只老鼠,每只老鼠代表一个二进制位,一个星期后我们可以得到老鼠的死亡序列,通过转换成10进制,我们就可以得到哪瓶水有毒。
我们拿8瓶水来举例子,用三只老鼠测试,首先我们将8瓶水写成2进制:
第一瓶 --- 000
第二瓶 --- 001
第三瓶 --- 010
第四瓶 --- 011
第五瓶 --- 100
第六瓶 --- 101
第七瓶 --- 110
第八瓶 --- 111
第一个老鼠负责第一个二进制位,它将去喝第二瓶,第四瓶,第六瓶,和第八瓶。
第二个老鼠。。。。
第三个老鼠。。。。
假如老鼠死亡的序列为101,我们就可以知道,有毒的水在第1位上有值,在第三位上有值,在第二位上没有值,通过比对我们可以得出,是第六瓶有毒。
如果上述描述不能理解,那就换一种描述的方法。
还是每个老鼠负责一位,我们先拿出第一瓶水,他的编码为000,不让老鼠去喝。 然后拿出第二瓶,他的编码为001,让1号老鼠去喝,。。。。。。。第八瓶的编码为111,让三只老鼠都去喝。一星期之后,假如没有老鼠死亡,说明有毒的药水是第一瓶,因为只有第一瓶三个老鼠都没喝,如果三个老鼠全死了,说明第八瓶有毒,因为只有第八瓶三个老鼠都喝了。
总结:
通用方法是讲试剂中哪瓶是毒品的信息总数表示出来为N,然后再找出小白鼠所能表示的状态数目为M,则需要的小白鼠个数为:K=logNMK=logMN
而具体实验的操作方法为:
讲每种状态按照M进制进行编码,编码长度为K
每个小白鼠分别去拿自身的M中状态去实验N的M进制编码的某一位
所以K个小白鼠,等同于是K长度M进制的对应的每一位
这样试验完后,就确定了每一位上面的数字,找到对应的那种状态就好。