称球问题的一般解法

本贴最后更新于 2523 天前,其中的信息可能已经事过景迁

本文发表于《CSDN 开发高手》2004 年第 5 期

称球问题相信大家已经很熟悉了,并且已经知道从 12 个球中找出坏球并判断其轻重最多只需要 3 次称量。但如果把球数改变一下,比如说 13 个球,答案又是几次呢?本文将对这一问题进行“深入”分析。为了后面叙述方便,先在这里把一般化后的问题重复一下:

有 m(m≥3)个球,记为 q1、q2、…、qm,其中有且仅有一个坏球,其重量与其他的不同,现使用无砝码的天平进行称量,令 n 为称量次数,问:能确保找到坏球并指出它与好球的轻重关系的 n 的最小值是多少?

先来看理论上要多少次。每次称量有左边轻、平衡和右边轻共 3 种可能的情况,而坏球的可能结果有 q1 轻、q1 重、q2 轻、q2 重、…、qm 轻、qm 重等共 2m 种。因此,根据商农的信息论,此问题的熵就是需要的称量次数,又因为 n 是整数,所以有:

不过理论终归是理论,直接拿到现实生活中往往行不通。一个很简单的情况,4 个球,上面的公式说 2 次称量就够了。但你可以想想办法,反正我是没找到两次解决问题的方案。

那,是理论错了吗?唔,我可不敢怀疑商农,我只敢怀疑我自己。来看看我们错在哪了吧。对 4 个球的情况,第一次称量只有两个可选的方案:

方案 1:q1 放左盘,q2 放右盘。若不平衡(由于对称性,只分析左边轻的情况,下同),则可能的结果还剩 q1 轻和 q2 重,再称一次就能找到坏球;若平衡,则可能的结果还剩 q3 轻、q3 重、q4 轻和 q4 重 4 个,再套用一下商农的定理,此时还要称次。所以方案 1 被否决。

方案 2:q1、q2 放左盘,q3、q4 放右盘。此时天平肯定不会平衡,称量后,可能的结果有 q1 轻、q2 轻、q3 重和 q4 重 4 个。同样的道理,方案 2 也难逃被否决的命运。

在 4 个球这么简单的情况下就撞得满头是包,未免让人难以接受,总结一下经验教训吧,把上面的分析归纳一下并推广到一般情况,就是:整个称量过程中,要达到目的,倒数第 k 次称量前的可能结果数 h,必须满足条件

上面的得出的结论虽然不能让我们找到问题的答案,但却有助于我们确定每次称量的方案,特别是第一次如何做。假设我们计划的称量次数是 n,第一次在左右两盘中各放 x 个球,则保证下面两个不等式同时成立是解决问题的必要条件:

    $2(m-2x) \le 3^{n-1}$  (平衡时)

    $2x \le 3^{n-1}$ (不平衡时)

把这两个不等式稍加变换,就成了下面的样子:

注意到 x 是整数,$3^{n-1}$
显然,在 n 一定的情况下,m 越大,x 的取值范围越小,而当 x 只能取值时,m 继续增大,就会导致 n 次称量找到坏球的计划破产。化简一下,可以得出在 n 一定的情况下 m 的取值范围:。发现了吗?现在 m 的最大值正好比我们最初的结果少了 1。同时此结果也与前面提到的 4 个球的实际情况相符。

但分析了半天,我们只证明了 m 不在取值范围内时,n 次称量不能确保找到坏球。那 m 在取值范围内的时候,肯定能找到吗?答案是肯定的,不过马上证明它有点难,先来看两个简单一点的命题。

**命题 1:**有 A、B 两组球,球的个数分别为 a、b,且 0≤b-a≤1,已知这些球中有且仅有一个坏球,若它在 A 组中,则比正常球轻,在 B 组中则比正常球重。另有一个好球。先使用无砝码的天平称量,令,则可以找到一个称量方案,使得最多经过 n 次称量,就可以找到坏球(此时肯定能指出它与好球的重量关系)。

使用数学归纳法证明如下:

  1. 当 n=1 时,a、b 的取值可能有{0,1}、{1,1}、{1,2}三组,由于还有一个已知的好球,所以不难验证此时命题成立。
  2. 假设当 n=k 时命题也成立。
  3. 当 n=k+1 时。我们将 A、B 两组球分别尽量平均得分为三组,记为 A1、A2、A3、B1、B2 和 B3。不影响一般性,假设这六组球按球数从少到多的排列次序也与前面的顺序一致,且 A1 有球 a1 个。则第一次称量时的称量方案与每组球个数的对应关系如下,其中需要注意的是:在最后两种情况下,必有,否则就与命题的前提不符了。
A1 A2 A3 B1 B2 B3 称量方案
a1 a1 a1 a1 a1 a1 A1、B1 放左盘;A2、B2 放右盘
a1 a1 a1 a1 a1 a1+1 A1、B1 放左盘;A2、B2 放右盘
a1 a1 a1+1 a1 a1 a1+1 A1、B3 放左盘;A3、B1 放右盘
a1 a1 a1+1 a1 a1+1 a1+1 A1、B2 放左盘;A2、B3 放右盘
a1 a1+1 a1+1 a1 a1+1 a1+1 A2、B2 放左盘;A3、B3 放右盘
a1 a1+1 a1+1 a1+1 a1+1 a1+1 A2、B2 放左盘;A3、B3 放右盘

很明显,不管结果是什么,第一次称量之后,问题都能转化为 n=k 时的情形。所以,命题 1 是真命题。

前面已经证明时,n 次称量无法确保找到坏球并指出其轻重关系。但如果此时也有一个已知的好球的话,答案就不一样了,这时 n 次称量就已经足够(命题 2)。仍使用数学归纳法。

  1. 当 n=2 时,m=4,验证一下可知命题成立。 
  2. 假设当 n=k 时命题也成立。 
  3. 当 n=k+1 时。我们把这些球尽量平均的分成三组,则每组球的个数分别为:。第一次称量时,第一组和那个好球放左盘,第三组放右盘。若平衡,问题转化为 n=k 时的情形,不平衡,问题转化为命题 1 的情形。命题成立。

有了前面两个证明作基础,最初的问题就很简单了,再次祭出数据学归纳法。由于 m<5 时的情况有些特殊(考虑只有一个球或两个球的情况),不能作为递推得依据,所以我们从 n=3,也就是 m=5 开始。

  1. 当 n=3 时,m 在 5 和 12 之间(13 的情况已经被排除在外),通过一一验证可知命题成立。 
  2. 假设当 n=k 时命题也成立。 
  3. 当 n=k+1 时,找到一个满足不等式的 x,在天平左右两盘中各放 x 个球。如果天平平衡,问题转化为 n=k 时的情形或命题 2 中的情形;不平衡,则转化为命题 1 的情形。命题成立。

综上所述,称球问题的完整答案是:当球数时,n 次称量时就能确保找到坏球,并指出它与好球的轻重关系;当球数时,n 次称量只能确保找到坏球,而无法指出它与好球的轻重关系。要想指出轻重关系,就可能需要多进行一次称量。但如果此时再有一个好球,就又可以把这次称量省掉了。

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 165 关注
  • 算法
    429 引用 • 254 回帖 • 24 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖 • 1 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 431 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 134 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 9 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 610 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1057 回帖
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 5 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 651 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    28 引用 • 226 回帖 • 138 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 277 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 546 关注
  • gRpc
    11 引用 • 9 回帖 • 90 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 592 关注
  • 分享

    有什么新发现就分享给大家吧!

    247 引用 • 1794 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 112 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 819 关注
  • abitmean

    有点意思就行了

    31 关注
  • OnlyOffice
    4 引用 • 23 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖