介绍
1000桶酒,其中1桶有毒。用小老鼠做实验,一旦吃了有毒的酒,一周后小老鼠毒性就会发作而亡。问如何在最短的时间内用最少的老鼠找到那桶有毒的酒?
思路一
将现有的酒分成两组,分别将两组酒混合后喂给两只老鼠,1周以后即能分出哪组里存在毒酒;依次类推的话。
2的10次方为1024,因此进行10次迭代操作,即可找到那桶毒酒。总计使用20只老鼠,10周时间找到毒酒桶。
这个估计大部分程序员都能想到的方案,但这个不是最佳的方案。
思路二
给现有的桶按1-1000的编号,最大编号为1000,其二进制表示11 1110 1000,共10位。我们使用10只老鼠,编号分别为:
第01只 00 0000 0001
第02只 00 0000 0010
第03只 00 0000 0100
第04只 00 0000 1000
第05只 00 0001 0000
第06只 00 0010 0000
第07只 00 0100 0000
第08只 00 1000 0000
第09只 01 0000 0000
第10只 10 0000 0000然后根据桶编号给相应的老鼠喂酒,如编号为100的酒桶,其二进制表示为00 0110 0100,其中从左边数第3、6、7位为1,取这桶中的酒喂给编号为3、6、7的老鼠,依次类推,将所有酒桶取酒喂给相应的老鼠。一周以后,根据死亡老鼠的编号,可以找出的酒桶,举个例子:比如第1、2、3、4只老鼠死亡了,那么表示的二进制数为 00 0000 1111,转换成10进制为15,因此可以推断出编号为15的酒桶中的酒有毒。
这确实是一种比较精巧的解法,依据二进制的表示,快速找到有问题的酒桶。