某天课上听老师讲起这个趣题,特此记录一下。
题目:有1000瓶液体,其中一瓶装了慢性毒药,喂食毒药一周后实验用小白鼠会突然出现失去生命体征反应,问最少用多少只小白鼠可以知道哪瓶液体中存有毒药(注意此处未考虑喂食毒药浓度及量,即有毒药就会产生反应,则可以喂食混合液体)。
方法一:
将1000只小白鼠按照2进制尽量分为两部分,其中一部分为2^9,即为512只,另一部分为488只,取任意一边混合液体用一只小白鼠测试,知道结果后可选是继续分哪一边,512只的一边按照2分可继续分为9层,488只的可分为484个9层和4个8层,即按照概率,有毒的瓶子可位于其中任意一瓶,则由二分法知需要小白鼠数量与层数相等,为10*996/1000+9*4/1000=9.996只,耗时为9.996周。
结果:取大于等于的第一个整数,共需10只小白鼠和10周时间。
方法二:
编码法,1000个瓶子最少需要10位bit来编码,从00 0000 0000到11 1110 1000(左边为高位,右边为低位),小白鼠依次对应10个位,每只小白鼠只喝对应位数为1的瓶子的液体,如有只瓶子为10 1010 1010,则第10、8、6、4、2只小白鼠要喝该瓶子内的液体,第9、7、5、3、1只小白鼠不喝,所有瓶子均对应喝完后等候一周,看小白鼠状态,为失去生命体征则为1,否则为0,从高到低排出该10位bit,即对应有毒药的瓶子编号。
结果:共需10只小白鼠,耗时1周。
可对比知第二种方法占优。