从二进制经典题“8瓶中有1瓶有毒,最少需要几只小鼠”来看进制思想

摘要

本文从头开始推理了这道经典题目,并简单地与二进制思想做了对比。

正文

偶然间又看到这样一道经典题目——“8瓶酒一瓶有毒,用小鼠测试。每次测试结果8小时后才会得出,而你只有8个小时的时间。问最少需要()人测试? ”

大多数马上就会反应到这就是个典型的10进制转2进制的题。我还好,我也想到这个方向了,但我还是没有想到如何在这个方向上解出来这个题。所以自己试着从头开始推断一下。

起初我是这么想的,既然是要找至少多少只,那先来8只,怎么用?很简单,1只试1瓶,看哪只有反应。

有7只该怎么用?也简单,1~7号小鼠喝1~7号瓶里的水,8号瓶不用,若1~7号小鼠里有反应,也可知有毒的在1~7号瓶里,若无反应,则8号瓶有毒。

有6只该怎么用?可以这么用:

鼠1 鼠2 鼠3 鼠4 鼠5 鼠6
1 2 3 4 5 6
2 3 4 5 6 7

 

让1号鼠号1、2号瓶,2号鼠喝2、3,...,6号鼠喝6、7号瓶。这样,若1号瓶或7号瓶有毒,则只会出现“鼠1或鼠6分别会有反应”这两种情况;若2号瓶有毒,则只会出现“只有鼠1和鼠2有反应”这一种情况;若3号瓶有毒,则只会出现“只有鼠2和鼠3有反应”这一种情况;...;若6号瓶有毒,则只有鼠5和鼠6会出现反应;若小鼠们都没反应,那就是8号瓶有毒了。

有5只该怎么用?与上同理,如表格所示:

鼠1 鼠2 鼠3 鼠4 鼠5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7

让1号鼠号1、2、3号瓶,2号鼠喝2、3、4,...,5号鼠喝5、6、7号瓶。这样,若1号瓶或7号瓶有毒,则只会出现“鼠1或鼠5分别会有反应”这两种情况;若2号瓶有毒,则只会出现“只有鼠1和鼠2有反应”这一种情况;若3号瓶有毒,则只会出现“只有鼠1、鼠2和鼠3有反应”这一种情况;若4号瓶有毒,则只会出现“只有鼠2、鼠3和鼠4有反应”这一种情况;若5号瓶有毒,则只会出现“只有鼠3、鼠4和鼠5有反应”这一种情况;若6号瓶有毒,则只会出现“只有鼠4和鼠5有反应”这一种情况;若小鼠们都没反应,那就是8号瓶有毒了。

有4只该怎么用?与上同理,如表格所示:

鼠1 鼠2 鼠3 鼠4
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7

让1号鼠号1、2、3、4号瓶,2号鼠喝2、3、4、5,...,4号鼠喝4、5、6、7号瓶。这样,若1号瓶或7号瓶有毒,则只会出现“鼠1或鼠4分别会有反应”这两种情况;若2号瓶有毒,则只会出现“只有鼠1和鼠2有反应”这一种情况;若3号瓶有毒,则只会出现“只有鼠1、鼠2和鼠3有反应”这一种情况;若4号瓶有毒,则只会出现“鼠1、鼠2、鼠3和鼠4有反应”这一种情况;若5号瓶有毒,则只会出现“只有鼠2、鼠3和鼠4有反应”这一种情况;若6号瓶有毒,则只会出现“只有鼠3和鼠4有反应”这一种情况;若小鼠们都没反应,那就是8号瓶有毒了。

有3只小鼠呢?从这里开始我犯了个错误,先按下不说,等分析完了再看到底错在哪里。与上同理,如表格所示:

鼠1 鼠2 鼠3
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7

仔细观察会发现,当3号、4号、5号瓶有毒时,都会出现“鼠1、鼠2和鼠3都会有反应”这种情况,失去了唯一表示的原则,所以3只小鼠是不够的,至少需要4只。

我错在哪里了呢?我错在了思维发生了惯性,简单地让每只小鼠增加喝的瓶数,而没有认识到“每个瓶要有情况对其唯一表示”这一原则。返回来再看3只小鼠的情况,我可以这么用:

鼠1 鼠2 鼠3
1 2 3
4 4  
5   5
  6 6
7 7 7

我突然发现,我在想到这种方法时,是利用了逆向思维,即若X号瓶有毒,我怎么来表示。

若1号瓶有毒,则我只用1号鼠做反应,即让1号鼠喝1号瓶;

若2号瓶有毒,则我只用2号鼠做反应,即让2号鼠喝2号瓶;

若3号瓶有毒,则我只用3号鼠做反应,即让3号鼠喝3号瓶;

若4号瓶有毒,则我用鼠1和鼠2做反应,即让鼠1和鼠2喝4号瓶;

若5号瓶有毒,则我用鼠1和鼠3做反应,即让鼠1和鼠3喝5号瓶;

若6号瓶有毒,则我用鼠2和鼠3做反应,即让鼠2和鼠3喝6号瓶;

若7号瓶有毒,则我用鼠1、鼠2和鼠3做反应,即让鼠1、鼠2和鼠3喝7号瓶;

若8号瓶有毒,我不用小鼠做反应,即小鼠们都不喝8号瓶。

这样就出现了如表格所示的情况,鼠1喝了1、4、5、7;鼠2喝了2、4、6、7;鼠3喝了3、5、6、7。

直接用二进制的思想来做的话,是这样,编号瓶为0、1、2、3、4、5、6、7;鼠为a、b、c。

鼠a 鼠b 鼠c
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

0表示没喝,1表示喝了。这样也可以对各个瓶的情况做唯一的表示。

总结

这两种方法有什么相同和不同之处呢?相同之处在于二者都是利用了“各个瓶的情况唯一表示”这一原则,不同之处在于具体的表示方法,后者是前者的规范化、标准化后的成果。前人之学也是这么不断的摸索出来的吗?深需我辈努力学习啊。

你可能感兴趣的:(算法)