有1000 桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周后找出那桶毒酒,问最少需要多少老鼠。(老鼠越少越好,时间越快越好)

方法一:类推法

  • 一只老鼠(①):

    喝一剩一,最多检验2桶酒

    ① + Ο =2

  • 两只老鼠(①和②):

    两只老鼠各喝一桶,再一起喝另外的同一桶,最后剩下一桶都不喝,最多检验4桶酒

    ① + ② + ①② + Ο =4

  • 三只老鼠(①、②、③):

    三只老鼠各喝一桶,两两组合喝三桶,三个一起喝一桶,最后剩下一桶都不喝,最多检验8桶酒

    ① + ② + ③ + ①② + ①③ + ②③ + ①②③ + Ο =8

  • 以此类推,发现规律——

    每n只老鼠,能检验的酒桶数量满足:

    $$ ∑=1+n+C{_n^2}+C{_n^3}+...+C{_n^n} $$

    根据二项展开式定理:

    $$ (a+b)^n=C(n,0)a^n+C(n,1)a^{n-1}b+...+C(n,i)a^{n-i}b^i+...+C(n,n)b^n $$

    上述结果等同于:2^n

    所以可知当老鼠的数目n满足:2^n>=1000时,能够满足条件。可得出n>=10,即最小为10只。

方法二:二进制表示法

一只老鼠喝酒后又两种状态:死(0)和活(1).
所以10只老鼠就能表示2的10次方个状态(即1024个).2^0表示2的零次方.2^8表示2的8次方.
设有10只老鼠编号分别为2^0,2^1,2^2,2^3,2^4,2^5,2^6,2^7,2^8,2^9.有1000桶酒编号为1,2,3.一直到 1000.
任何一桶酒的编号都能分解为2的幂指数之和的形式,而且唯一.比如:第九桶酒 9= 2^0 + 2^3
(那么我们就让编号为2^0和 2^3的这两只老鼠去喝这桶酒)最后只要看哪几只老鼠死了就知道是哪桶酒有问题.(只要把死了的老鼠编号加起来就是酒桶的编号)

比如:
如果最后死掉第三、七、八只老鼠,那么就是0011000100,转换成十进制就是196,即196桶酒有毒。
如果是第3和第10只老鼠死掉,即是:1000000100,转换10进制为2^2+2^9=4+512=516桶酒有毒


旭旭
1 声望0 粉丝

喜欢算法,欢迎大家给出意见~