解决任何难题的关键是要敏锐捕捉那些能够表明问题性质的关键线索。这些线索有多种表现形式——从问题的遣词造句和提问人的语调,到你对假设本身的逻辑推断。
如果你在一艘很快就要沉没的船上,最先扔掉的东西肯定是最重、最不值钱的东西。同样,排除错误假设的方法也应该按照最无关到最本质的顺序进行。所列的第一个假设(不能打开瓶子)相对来说很少有人感到困扰,题目中没有明确说明允许打开瓶子,也没有说明不允许打开瓶子。问题问的是哪一个“瓶子”污染了,而不是哪一瓶药丸污染了。生性小心的人或者完美主义者寻找一流的解决方案,认为可以把瓶子进行整体称重。这种想法本身是没有错的,解题的人初见这个问题总是会有一种这样强烈的感觉。
但是再仔细想一想,就会发现这个假设本身是不成立的。假定你选定2号瓶来称重,天平显示重量为1 027克。那么瓶子的重量是多少呢?你无从得知。没有人告诉你瓶子的重量。瓶子里有多少药丸?你也无从得知。也没有人会告诉你瓶子里有多少药丸。除非瓶子里的药丸数量很少,可以数得清楚,否则你就像一个通过猜测瓶子里的弹子数量来赢取自行车的孩子一样,哪有什么准头呢?再说了,你甚至不知道各个瓶子里的药丸数目是否相同。
因此你应该立刻对这个假设进行分析。题目的内容并没有强烈地表明这些内容,如果你采纳了这个假设,你就会发现并没有足够的信息支持你解决问题。很明显你必须对药丸称重,而不是瓶子。
以上信息表明我们有必要转移到假设2,也就是所有用来称重的药丸必须是同一个瓶子中的。有时候有一种简化问题的倾向:如果所有的药丸都是来自于同一个瓶子,那么问题似乎就容易得到解决。但是如果你接受了这种限定(在问题中并没有提及),问题是不可能得到解决的。
你能很快地说服自己这个假设是有问题的。当称重的药丸都来自于同一个瓶子中,只有两种可能性:你所称量的不是正常的药丸,就是受污染的药丸。假定你从第3号瓶中拿出10粒药丸进行称量,重量显示为90克,那么就证明3号瓶是污染瓶,这样只能说是你很走运。问题是,如果你是从别的4个瓶子中拿药丸呢?那么你用天平称出的10粒药丸的重量就是正常的100克,这样你就无法确定剩下的瓶子中哪一瓶有受污染的药丸。无论你用何种方案从一个单个的瓶子取样,都会面临着这个问题。这就表明,要想得到正确的答案,就必须对一个以上的瓶子中的药丸进行称量。
一些微软的面试者常常在第三种假设上翻船(非程序员则很少这样)。那些习惯于信息论的人很容易这样推论:不管是对单一的药丸还是对一组相同的药丸称量,都只能得到一个是或否的结果。所得的重量不是正常的重量就是污染后的重量。这只是一个单一的信息,任何一个程序员都知道不可能用一个单一的信息来确定五个事物中的一个。
当然这种分析是没有意义的,这又陷入了第二个假设中。只有在所有的药丸都相同的情况下(也就是都在同一个瓶子的情况下),才可以得到一个是或否的结果。