小白鼠试毒药
题目如下:
实验室里有1000个一模一样的瓶子,但是其中的一瓶有毒。可以用实验室的小白鼠来测试哪一瓶是毒药。如果小白鼠喝掉毒药的话,会在一个星期的时候死去,其他瓶子里的药水没有任何副作用。请问最少用多少只小白鼠可以在一个星期以内查出哪瓶是毒药:
a. 9
b. 10
c. 32
d. 999
e. 以上都不对
解:
假如需要N只小白鼠,根据题目,N只小白鼠必须都是在第一天喝药,这样才能保证在一个星期的时候检测出结果。当然,最“笨”的方法(不过显然不是最后的答案,因为答案要求是最少的数目)就是999只小白鼠,一只喝一瓶,七天以后死的那只对应的瓶子里的药就是毒药;如果七天后都没死,第1000瓶就是毒药。但这种方法没有充分利用条件,即“没有任何副作用”。没有任何副作用,就是说除喝了无副作用的药不会死之外,一般的药和毒药混在一起喝也不会影响毒药的作用。其实,完全应该想到可以让每只小白鼠喝若干瓶,每瓶也可以被若干只小白鼠来喝,通过七天后死了哪些小白鼠可以计算出到底哪瓶里有毒药。再看一下选项,B是10,C是32,似乎跟二进制多少有些关系(2^10=1024≈1000,32=2^5)。
不多分析了,还是看具体方法吧。
先将1000个瓶子编上号,1-1000,然后用二进制表示瓶子的编号,这需要10个二进制位组成的二进制数来表示。由于每个二进制位可以存0或1,所以10个二进制可以表示2^10=1024个数,完全可以表示1000个瓶子(但9个二进制位只能表示2^9=512<1000,不能表示1000个瓶子)。
个人感觉二进制表示是本题最关键的部分。那为什么要用二进制表示呢?想象一下,七天以后对于每只小白鼠要么没喝到毒药还活着,要么喝到毒药死了,只有这两种状态,正好对应于二进制的0和1。这样看来,只需要10只小白鼠,每一只可以应于一个二进制位。为了便于描述,不妨给小白鼠编号,1-10,对应于从高位到低位的10个二进制位。
下一步要确定每只小白鼠需要喝哪些瓶药,或者反过来说,每瓶药应该被哪些小白鼠喝。任选一瓶药,由于编号是用二进制表示的,所以对于每一个二进制位,如果是1,则对应位置的小白鼠就喝这一瓶,否则就不喝。比如对于1001010101这个二进制数(十进制是597),从最高位数起,第1、4、6、8、10位上是1,所以这一瓶就由编号为1、4、6、8、10的小白鼠来喝。这样,所有1000瓶药就可以分给10只小白鼠来喝。
最后一步要根据死亡的小白鼠的编号来确定毒药的编号。假如七天以后编号为1、4、6、8、10的小白鼠死了,而其他小白鼠还活着,就说明第1、4、6、8、10是1、其余位是0(二进制为1001010101,十进制为597)的这一瓶是毒药。可以想象一下(其实数学上称之为反证),假如毒药不是这一瓶而是另外一瓶,比如0000100001(即第33瓶)是毒药,那么根据七天前喝药的步骤,这一瓶药应该是编号为5、10的小白鼠来喝,七天以后死亡的应该是编号为5、10的小白鼠,而不是编号为1、4、6、8、10的小白鼠。因此,按照以上方法就可以确定毒药所在瓶的编号。
不知您明白了吗?

浙公网安备 33010602011771号