老鼠毒药问题

这是一个传播得非常广的问题:有1000瓶液体,其中一瓶是毒药,其他的都是清水。毒药看上去和水一样,只能用老鼠来试验。老鼠在喝了毒药以后一个星期后一天内的任意时刻死亡。最少需要多少只老鼠才能找到毒药?

n瓶液体当中一瓶有毒,总共有n种可能,用集合N表示。一只老鼠的试验以后的生死可以用0、1表示,r只老鼠的生死是一个0、1串,总共有2的r次方中结果,用集合R表示。

我们要找到一个实验方法f,把N中元素分别映射到R上。并且N中的两个元素不能对应R中的同一个元素。

也就是说,第1瓶有毒和第2瓶有毒这两种可能,不能在我们做完实验以后,得到老鼠的生死是一致的。

所以R中的元素至少N中的元素相等。因此2的r次方大于等于n,  r >= log(n)。

回到这个问题上来,理论上,我们需要10只老鼠才能找出隐藏的毒药。

具体来说应该怎么操作呢,也就是我们要寻找一种算法。以及这种算法是否能只用10只老鼠就找到1000当中的毒药呢?

如果有一只老鼠,我们可以让它喝一半的药水。它的生死就能确定毒药在哪一半。

例如n = 8。

000 001 010 011 100 101 110 111

老鼠a                                 1     1     1     1

老鼠a和右边的药水,如果毒药在右半边,老鼠死;否则,老鼠活。

也就是用二进制去编码药水一只老鼠的生死可以指示这一瓶毒药某一位的状况

000 001 010 011 100 101 110 111

老鼠a                                  1     1     1     1

b                    1      1                  1     1

c              1            1           1            1

如果是1000瓶药水,依次用二进制表示。依照上面的方式我们可以用10只老鼠来找到唯一的毒药。

这个问题还有一些变化。

如果1000瓶液体当中有两瓶毒药,最少需要的老鼠是多少呢,应该如何操作?

根据前面的方法,我们先计算理论上的下界。

毒药的分布总共有C(1000,2)中情况,我们最少需要19只老鼠。

具体如何操作呢?

首先把毒药平均分成两组,如何确定毒药在哪一组呢?

例如:

A:   000 001 010 011

B:   100 101 110 111

一只老鼠是不够的

我们用两只老鼠a,b。a喝下A组,b喝下B组。

如果两只老鼠全部死去,我们可以确定毒药分别在A、B当中。如果老鼠只有一只死去,我们可以确定两瓶毒药在同一组里

也就是说通过上诉方法,我们可以确定毒药编号的二进制表示的第1位的状况(都是1,都是0,分别是0、1)

这个方法能否确定第2位的状态呢?

答案是能。

但是存在一个问题。

如果第1位分别是0、1,第2位也分别是0、1,那么这两个瓶的编号是00、11,还是01、10呢?

如何解决这个问题呢?

如果我们知道两瓶毒药的编号的第1位是不同的

例如:

A:   000 001 010 011

B:   100 101 110 111

毒药1在A组,毒药2在B组,那么这个问题就变成了寻找一瓶毒药的问题。针对n=8的情况,我们可以再使用2对老鼠就能找到两瓶毒药的编号。

如果我们有两周试验的机会,可以第一周先用2对老鼠(为什么是2对?)找到毒药编号哪一位是不同的。在知道哪一位不同以后,在第二周用2对老鼠得到两瓶毒药的其他位值。也就是说我们可以用2*log2(n/2)+2*log(n/2) 只老鼠在两轮试验的情况下找到两瓶毒药

但是我们只允许有1轮试验时间,如何解决呢?

既然不能猜,我们就全押好了。

对于n=8的情况,两瓶毒药的编号,可能在1、2、3位不同。总是有一位不同,也有可能好几位不同。

我们先押第1位不同,也就是两瓶毒药分别在A、B组当中:

A:   000 001 010 011

B:   100 101 110 111

用2对老鼠分别测试A、B组毒药。

再押第2位不同,两瓶毒药分别在C、D组中:

C: 000 001 100 101

D: 010 011 110 111

也是用两对老鼠

再押第3位不同,分别在E、F组:

E: 000 010 100 110

F: 001 011 101 111

那么这样测试的结果会如何呢?

假设两瓶毒药编号在第3位相同。

比如是010, 100,那么E、F两组测试的结果是F组的老鼠全部存活下来;

如果是011, 111,那么E、F两组的测试结果是E组的老鼠全部存活。

所以第3位不相同的假设是不成立的。

也就是说哪一位如果是相同的,针对那一位做的实验会出现一组当中全部存活的情况。因此这两组针对这一位的实验是无效的。

如果两瓶毒药在第1位是不同的,

例如毒药编号是011、100,那么A、B组当中都会出现死亡,那么第1位不同的假设是成立的,我们可以得到各个位的值。

综上所述在猜测某一位不同时,我们需要2*log(n/2)只老鼠;要押中所有位的话,我们需要log(n)*2*log(n/2)只老鼠。

也就是说,如果n=1000,有两瓶毒药。用上述方法,我们需要(10*2*9)180只老鼠,才能找出毒药编号。

离我们的下界19有些远。

时间: 2024-10-17 16:36:41

老鼠毒药问题的相关文章

老鼠毒药问题和它的扩展

这是一个传播得很广的问题:有1000瓶液体.当中一瓶是毒药.其它的都是清水.毒药看上去和水一样.仅仅能用老鼠来试验.老鼠在喝了毒药以后一个星期后一天内的随意时刻死亡. 最少须要多少仅仅老鼠才干找到毒药? n瓶液体其中一瓶有毒,总共同拥有n种可能性,用集合N来表示. 一仅仅老鼠的生死能够用0.1表示. r仅仅老鼠的生死构成了一个0.1串,这个0.1串能够表示2的r次方中结果,用集合R表示. 我们就是要找一个实验方法,通过这些老鼠的生死获取毒药的编号. 假设做个抽象,这个实验方法是F.F把N中元素分

经典老鼠毒药问题

问题1. 有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药.任何喝下毒药的生物都会在一星期之后死亡.现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药? 问题2. 有 8 个一模一样的瓶子,其中有 7 瓶是普通的水,有一瓶是毒药.任何喝下毒药的生物都会在一星期之后死亡.现在,你只有 3 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药? 确定问题是否可以解决: 2^10=1024>10002^3=8>=8 瓶子数不超过2的老鼠数次幂,都是可以解决

十只老鼠和一千瓶毒药的故事。。。

问题描述:有1000个一模一样的瓶子,其中有999瓶是普通的水,有1瓶是毒药. 任何喝下毒药的生命都会在一星期之后死亡.现在你只有10只小白鼠和1个星期的时间,如何检验出哪个瓶子有毒药? 解答: 根据2^10=1024,所以10个老鼠可以确定1000个瓶子具体哪个瓶子有毒.具体实现跟3个老鼠确定8个瓶子原理一样.000=0001=1010=2011=3100=4101=5110=6111=7一位表示一个老鼠,0-7表示8个瓶子.也就是分别将1.3.5.7号瓶子的药混起来给老鼠1吃,2.3.6.7

[数学问题]毒药和老鼠的研究[转]

转自:http://www.cnblogs.com/icyJ/p/Mouse_Poison.html 基础: 1.整数的二进制表达式 1000/2=500 --(余)--0 500/2=250 --(余)--0 250/2=125 --(余)--0 125/2=62 --(余)--1 62/2=31 --(余)--0 31/2=15 --(余)--1 15/2=7 --(余)--1 7/2=3 --(余)--1 3/2=1 --(余)--1 1/2=0 --(余)--1 1000的二进制表达式为

【每天进步一点】毒药和老鼠的研究

之前碰到过毒药和老鼠,鸡蛋和称的问题,每次都拿笔在纸上推敲很久,这类问题今天终于有了完整的解决思路. 基础: 1.整数的二进制表达式 1000的二进制表达式是什么呢? 1000/2=500 --(余)--0 500/2=250 --(余)--0 250/2=125 --(余)--0 125/2=62 --(余)--1 62/2=31 --(余)--0 31/2=15 --(余)--1 15/2=7 --(余)--1 7/2=3 --(余)--1 3/2=1 --(余)--1 1/2=0 --(余

用最少老鼠数找出7瓶药中的1瓶毒药

原文链接:https://www.jianshu.com/p/607d6683748b https://blog.csdn.net/limitless1113/article/details/46681851 题目如下:现有7瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有1个小时的时间,请问找出那瓶毒药最少需要多少只老鼠? 现在有3只老鼠,那么我们以老鼠的死和排序作为一瓶药的编号.例如: 001 代表第一瓶药 010代表第二瓶药 011代表第三瓶药 100.101.110.111一次

问题:有1000杯水,其中有一杯是毒水,现在需要从中找出含毒药的水,可以用老鼠来实验;老鼠如果喝了有毒的水,一个小时内必死,请问如何安排试验,能够用最少的实验材料在一个小时内检测出有毒的水?

对于每一杯水,我们可以选择让哪些老鼠喝,哪些老鼠不喝,将10个老鼠编号,就可以将老鼠们的喝与不喝的情况转化成二进制,比如1号鼠和3号鼠喝,那二进制就是0000000101,那我们可以用这个二进制标识一杯水,因为2的10次方是1024,因此每杯水的二进制都可以不一样.一个小时内,喝了有毒的水的老鼠必死,根据死亡情况和老鼠的编号就判断出哪一杯水有毒,比如1号鼠和3号鼠死了,那有毒的那杯水的二进制编码就是0000000101. 原文地址:https://www.cnblogs.com/catpaint

老鼠喝药问题的解法

今天又遇见一个有趣问题,有趣就会分享. 和往常一样,当然是我自认为这个题目有意思,有研究的价值.题目如下: “32瓶液体,1瓶有毒,老鼠喝了1小时死亡,用1小时确定至少30个瓶子无毒,至少需要多少老鼠.” 我的解法如下: 又是一个求最优解的问题.这个问题需要把一个老鼠能使用的信息用到极致,即能达到最优解.首先假设n个老鼠最多可以很明确地确定f(n)瓶液体中的那瓶毒药. 那么 1.对于这n个老鼠,每个老鼠各自喝一瓶液体,可以确定C(n,1)瓶液体中的唯一一瓶毒药. 2.在1所能确定的数目基础上,将

老鼠试毒 两轮试验

大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药.任何喝下毒药的生物都会在一星期之后死亡.现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药? 这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数.让第一只老鼠喝掉1到1000所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等.一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,