原题

有一千瓶水,其中有一瓶有剧毒,但是无法通过物理方法把它们区分开,只能用老鼠去尝试。老鼠喝了毒药后一个小时内会死亡,只有一个小时的时间,最少需要多少只老鼠才能把有毒的水区分开来?

解法

答案是10瓶水。把每瓶水从0到999号标号,并转换成二进制。由于$2^9 (512)<1000<2^{10}(1024)$,所以需要10位二进制码。找来十只老鼠分别对应十个二进制位。第一位的老鼠把所有编号第一位是1的水喝一遍,第二只老鼠把所有第二位是1的水喝一遍……。最后看哪些老鼠死了,把这些老鼠对应的二进制编码串起来就得到有毒的水的编号。比如第1、3、4、6只老鼠死了,则编号为0000101101B=45,第45瓶水是有毒的。把解法说出来以后其中的原理还是比较显然的,就不啰嗦了。

变体

有11瓶水,其中一瓶是有毒的,其他条件和上题一样,但是要求找出9瓶没有毒的就可以。

解法

这道题如果照搬上面的做法就不行,因为题目要求只要找出9瓶就可以了,不需要全部找出来,而使用上面的做法会认为需要$[log_211]=4$只老鼠就会多此一举。 正确做法是把11瓶水两两分组分成6组(有一组只有一瓶)并将一组的两瓶混起来。那么题目就划归为六组水中找1组有毒的,剩下五组对应的9-10瓶水都是没有毒的,答案是只需要三只就可以了。

更一般性的解法

可以看到上面两种做法都要具体问题具体分析,不具有一般性,为了得到所需老鼠的数量必须明确给出具体的做法,而且没有办法确定找出的答案是不是最优解。结合信息论,我们可以在不知道做法的情况下知道需要的老鼠个数。

以原题为例,1000瓶水中有一瓶是有毒的,问题的不确定性(熵)为$log_21000$比特(有1000中等概率的可能性),每只老鼠可以帮助我们获得$log_22=1$比特的信息(每只老鼠或者死或者不死,存在2种可能),因此需要$[\frac{log_21000}{log_22}]=10$只老鼠才能把问题的熵减小到0.

那么对于变体呢?一开始问题的熵为$log_211$,结束状态时,因为找出9瓶没毒的意味着剩下两瓶不确定的,所以问题的熵为$log_22$。其中需要减少的熵为$log_211-log_22\approx2.4594$,因此需要3只老鼠。

这种方法更具有通用性,而且能明确给出最小需要的老鼠数量的极限。