问题一:现在有10瓶药,合格的药每颗10克,但是有1瓶中的药不合格,每颗9克。问:称1次如何辨别哪瓶是不合格的?
答:将药瓶编号1,2,3...10,分别从中取1颗、2颗、3颗...10颗。共计55颗,用称称重,如果是正常的话,重量应为550克。如果比550克少1克,则是1号瓶不合格。如果少2克,则2号瓶不合格,依此类推。
问题二:现在有10瓶药,合格的药每颗10克,但是有其中的某几瓶中的药不合格,每颗9克。问:称1次如何辨别哪瓶是不合格的?
答:不能用问题一的解法,如果比550克少6克,那么可能是6号瓶不合格,也可能是2号和4号瓶皆不合格,也可能是1号和5号瓶皆不合格。此时我们应该考虑使比550克轻的克数对应唯一的药瓶的编号。所以我们将药瓶编号1,2,3,4...10,分别从中取1颗、2颗、4颗、8颗……512颗(取的颗数以2为底,瓶的编号减1为幂次)。那么一共1023颗,如果正常的话,重量应为10230克。如果比10230克少1克,则是1号瓶不合格。如果少2克,则2号瓶不合格。如果少3克,则1号和2号瓶皆不合格。如果少4克,则3号瓶不合格。我们以二进制将比10230克少的克数编码,如果少100克,对应二进制为1100100,则3号、6号和7号瓶皆不合格。依此类推。最后,如果比10230克少1023克,1023对应二进制数1111111111则所有的药瓶都是不合格的。
问题二让我想起了2013年11月,那时刚学了两个月的计算机。有一天晚上,羽哥问我,如果现在有8杯酒,其中有某几杯是毒酒,现在你有小白鼠可以拿来测试,如果小白鼠喝了毒酒,就会死去,否则没事。请问最少用几只小白鼠就可以完成任务?
这个问题的答案与问题二的答案是相似的。将酒杯编号0号、1号、2号……7号,对应的二进制编码为000, 001, 010, 011, 100, 101, 110, 111。那么在试验中,000表示没有老鼠喝这杯酒,001表示第一只老鼠喝这杯酒,其他老鼠不喝。010表示第二只老鼠喝这杯酒,其他老鼠不喝。011表示第一只和第二只老鼠都喝这杯酒,第三只老鼠不喝。100表示第三只老鼠喝这杯酒,其他老鼠不喝……111表示三只老鼠都喝了这杯酒。那么我们用了3只老鼠,就把8杯酒都唯一地标识了出来。如果000有毒,则没有老鼠死去。如果001有毒,则第一只老鼠死去,其余两只活着。如果010有毒,则只有第二只老鼠死去。如果011有毒,则第一只和第二只老鼠死去。如果100有毒,则第三只老鼠死去……如果111有毒,则三只老鼠全部死去。
问题二和毒酒问题都对应着编码问题。小白鼠的数量3只,足以编码8个状态,辨别8瓶酒各自的状态(log28=3)。
给毒酒问题找到两张图,也许能够更形象地说明这个问题:
这两张图就说明了老鼠A,B,C去试7杯毒酒的过程,我们能从Figure 1.1 中看到每只老鼠对应哪些毒酒。而Figure 1.2 则给出了每个酒杯的编码(当然这里的酒杯是7个,编码也与我们上面的讨论有少许不同)。
图片出自密歇根大学的一篇论文:Pooling Designs for High-Throughput Biological Experiments.