新学期开始,在课本习题上看到一道这样的题:
有15瓶药水,其中一瓶有毒。假定一只小白鼠喝下药水后是否中毒需要一个小时才能体现出来。如果有4只小白鼠,是否有办法用一个小时的时间检测出有毒的药水?
其实以前也做过类似的题目,问法不相同,问的是至少需要多少只小白鼠才能确定有毒的药水。
题目的具体解法是对小白鼠进行编号,从1-15(而不是编程习惯0-14),然后使用二进制表示法对这些编号进行编码:
mouse | binary code |
---|---|
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
13 | 1101 |
14 | 1110 |
15 | 1111 |
于是可以按照表格中二进制表示法中的每一列来配置药剂,一共四列,可以配置四管,“1”表示有,“0”表示没有。
四个杯子的混合药水分别给4个老鼠喝,就可以根据老鼠死亡的情况判定哪个瓶子药水有毒。用“1”表示老鼠死了,“0”表示老鼠没死。
比如第一个老鼠死了,第二个老鼠没死,第三个老鼠死了,第四个老输死了,就是1011,就是11号瓶子有毒。
能使用这种方法的原因是二进制的特点是逢二进一,因此对15个个体进行编号以及编码表示,二进制位只要4位,而且所有表示法并成一列的话,从横向看每一种表示都是不同的,因此可以进行区分。首先混合试剂的方法很容易想到,先定毒药为变量p,那么可以清楚的知道不加p老鼠就不会死(仅有一瓶毒药),因此老鼠如果死了一定加了p,对应的p的位置的试剂一定是“1”,不加p的老鼠不会死,因此没有死的老鼠喝的试剂对应的p的位置为“0”表示没有添加p。这样就可以确定到底是第几瓶药水杀死了老鼠