原文链接: https://www.jianshu.com/p/607d6683748b
条件:
现有1000瓶药,其中有一瓶毒药,喝了之后1小时后才产生效果,现在你有10只老鼠和1个小时的时间,请问怎么找出毒药?
问题:
现在给1周的时间,用10只老鼠找出1千瓶水中的那瓶水。
解答:
思路: 老鼠被喂药后,只有 死 和不死两只状态。所以其实就是可以理解为需要几位二进制数能表示表示这1000种状态。
,让我们能区分开来这1000瓶毒药。
- 计算需要多少只老鼠:需要表示的1000瓶水(状态),最少需要log2(n)只老鼠来表示。本次需要log2(1000) = 10 只老鼠进行表示
- 将所有的水按照,1、2、3。。。。。1000编号,并全部转为二进制表示。例如3为 00000 00011,1000为 11111 01000。
- 老鼠按照1、2、3。。。编号,把所有第一位为1的水混在一起喂给一号老鼠,把所有第二位为1的水混合在一起喂给二号老鼠。按照规律喂给所有老鼠。
- 一小时后,统计十只老鼠的状态,死了相应位记为1,活着相应位记为0。按照老鼠编号1-10对应bit位从低到高,对应的10进制即为有毒药水的编号。
第二种变体
如果1000瓶里有2瓶毒药,需要多少只小鼠?
1000瓶里1瓶毒药有1000种可能性,而1000瓶2瓶毒药则有C(1000,2),即499500种可能性,那么log2(499500) 为18.93,即需要19只小鼠。具体实现方式为以两两混合法将1000瓶拆成499500滴,并用题目1中的方法测得。
那么对1000瓶中的N瓶毒药,则需要log2(C(1000,N))只小鼠,若N>=500,则取C(1000,1000-N)。
第三种变体
有16瓶水1瓶有毒,用多少只小白鼠能测出14瓶无毒的水?
将16瓶药水用二进制XXXX表示,取3只小白鼠来测,测出的状态为XXX,那么毒在XXX0或XXX1中,剩下14瓶无毒。