1. 一道让无数人挠头的经典问题
“10只老鼠、1000瓶水,其中一瓶有毒,给你一个夜晚,怎么找出那一瓶?”
我第一次看到这道题,心里是有点不服气的。1000瓶水,我一瓶一瓶喂给1000只老鼠,不就直接试出来了吗?但题目卡死只能用10只,这一下就从“动物实验”变成了“编码题”。后来真正把思路理清楚,我才发现这一步跨越非常漂亮:你把每只老鼠当成一个二进制位,把“死没死”当成0和1,问题就瞬间变成一个查表问题——毒瓶编号就是死亡老鼠名单构成的二进制数。
这道题流传很广,但很多人只是背了一个“2的10次方等于1024”的结论。这篇文章我想把整个思考路径、实操流程、常见误区、以及背后真正有用的信息论直觉全部拆开。它能帮你训练的不仅是解一道面试题,更是一套“用有限状态去区分大规模可能性”的思维模式。不管你是准备面试、带新人、还是纯粹对这种智力题感兴趣,我都推荐你花十几分钟把它读透。读完之后你会发现,同一个模型在医学检验混合检测、分布式系统故障定位、甚至编码纠错里都能找到影子。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从直觉方案到信息视角:先把问题翻译成模型
2.1 题面条件,一个都不能漏
先别急着算2的10次方,我们把题面当成一道建模题来拆。条件是:1000瓶水中恰好有1瓶有毒;毒发时间已知且有限,必须在一轮实验内完成;有10只老鼠可用,老鼠喝到毒水后死亡可观测。隐含条件还包括:每瓶水的存量足够重复取样,混合取样不会互相抵消,老鼠对毒物的响应是确定性的。
这些条件其实非常理想化。尤其注意“恰好1瓶”这几个字,它是整道题的地基。如果毒瓶数量不确定,状态数会完全不同,这一点我放到后面扩展里细说。还有一个容易忽略的点:题目要求的是“找出来”,不是“确认毒在这100瓶里”,所以最终结果必须唯一锁定到某一瓶。
2.2 两个直觉方案,为什么都差一口气
方案一:1000只老鼠,每瓶喂一只。逻辑直接,但10只老鼠显然不够。那让每只老鼠喝100瓶的混合液呢?如果毒在其中,这只老鼠会死,但你只能知道毒在它负责的那100瓶里,范围从1000缩小到100,依然锁定不了具体瓶号。
方案二:二分排查。把1000瓶分成500和500,用同一只老鼠喝左边500瓶的混合液,死了毒在左,没死毒在右;然后继续四分、八分……但这个方法需要多轮实验,每一轮都要等毒发。如果题目限定只有一次观察机会,这个方案直接出局;就算允许多轮,10只老鼠也只是帮你压缩了轮次,不一定是最优解。
这两个方案败在同一个地方:没有充分利用“10只老鼠同时实验”的并行信息。10只老鼠同时实验,每只都会给出一个“死/活”结果,虽然只有10个结果,但结果与结果之间的组合数却非常可观。这里需要一个跳跃:不是用“老鼠数量”去匹配“瓶子数量”,而是用“状态组合数”去覆盖“瓶子数量”。
2.3 从“互斥分组”到“重叠编码”
方案一和方案二的本质都是“分组”,组与组互斥——一瓶水只属于一个组,一只老鼠只喝一组混合液。互斥的好处是清晰,坏处是信息效率低:一次实验只能划出10个桶,对应10种结果,1000种可能性根本拉不开差距。
这时候可以做一个看起来有点反直觉的操作:让同一瓶水出现在多个老鼠的杯子里。也就是说,一只老鼠的死亡与否同时受很多瓶水影响,然后把所有老鼠的死活结果组合起来,去识别具体是哪一瓶。这种“重叠”
