称球问题-找出球中的坏球
称球问题-找出球中的坏球
原作者参考:http://blog.csdn.net/pongba/article/details/2544933
问题
问题模型描述:n个小球,其中有一个是坏球。有一架天平。需要你用最少的称次数来确定哪个小球是坏的并且它到底是轻还是重。有的题目给出了坏球是轻还是重。
这个问题是一道流传已久的智力题。网络上也有很多讲解,还有泛化到N个球的情况下的严格证明。也有零星的一些地方提到从信息论的角度来看待最优解法。本来我一直认为这道题目除了试错之外没有其它高妙的思路了,只能一个个方法试,并尽量从结果中寻找信息,然后看看哪种方案最少。
思路原则
数学之美中提到了一种数学分析的等概率模型。
现在我们用天平来称球,就等同于对所有情况可能性发问,由于天平的输出结果有三种“平衡、左倾、右倾”,
这就相当于我们的问题有三个答案,即可以将所有的可能性切成三份,
记住一个原则,我们应当尽量让这三个分支概率均等,即平均切分所有的可能性为三等份。
如此一来的话一次称量就可以将答案的可能性缩减为原来的1/3,三次就能缩减为1/27。
比如12个球不知道轻重,才有24种可能性,所以理论上是完全可以3次称出来的。
接下来我们用简单的实例来实际分析问题。
已知轻重找球问题
问题:现在9个小球,其中8个质量相同,有一个坏球较轻一点,如果用天平称,至少称多少次保证能找出这个较轻一个。
这里较轻较重的分析是一致的。
可能性:现在有9个小球,并且我们知道坏球是轻的。所有一种有9中可能性。
1-,2-,3-,4-,5-,6-,7-,8-,9- (这种用-号来表示 轻)
决策选择:按照等概率模型的原则,我们应该找出一种比较方法,能够使天平的三种情况缩减的问题可能性等量缩减。
这里我们使用三分的办法,9个小球分成三份称。希望每种最后缩减可能性都为3种。
可能性分析:这里我采用图表方式分析。
这里我们至少需要两次称重可以确保找出坏球。当然碰运气,第一次就出现的不算。
原谅我没有找到一个合适的画图工具,如果有人看文章的话希望可以推荐一个。
未知轻重找球问题
问题:现在9个小球,其中8个质量相同,有一个坏球,不知道轻重,如果用天平称,至少称多少次保证能找出这个坏球。
可能性:现在有9个小球,并且我们不知道知道坏球是轻重。所有一种有18种可能性。
1-,2-,3-,4-,5-,6-,7-,8-,9- ,1+,2+,3+,4+,5+,6+,7+,8+,9+ (这种用-号来表示 轻 +来表示 重)
决策选择:按照等概率模型的原则,我们应该找出一种比较方法,能够使天平的三种情况缩减的问题可能性等量缩减。
这里我们使用三分的办法,9个小球分成三份称。希望每种最后缩减可能性都为6种。
可能性分析:这里我采用图表方式分析。
这里比较难想的问题是 中间第二次进行称重的时候该如何选择。
这里我建议先用 球多用划分轻重组合法 后用球少逆向思维借助法
划分轻重组合法: 第二次 称重先划分组数 三组 >情况 1+ 4- 2+5- <情况 1- 4+ 2-5+
逆向思维借助法:第二次=的情况 划分三组 每组一个球 不能推出结论
借助其他标准小球
感觉这里的解释 有些牵强 因为具体的情况总是不同的分析方式 不好统一描述
有读者有更好的分析方式,请联系我。
下面再看一题
问题:现在12个小球,有一个坏球,不知道轻重,如果用天平称,至少称多少次保证能找出这个坏球。
可能性:现在有12个小球,并且我们不值知道坏球是轻重。所有一种有24种可能性。
1-,2-,3-,4-,5-,6-,7-,8-,9- ,10-,11-,12- ,1+,2+,3+,4+,5+,6+,7+,8+,9+ ,10+,11+,12+ (这种用-号来表示 轻 +来表示 重)
可能性分析:这里我采用图表方式分析。
图片来源:http://www.inference.org.uk/mackay/itprnn/ps/65.86.pdf
称球问题-找出球中的坏球相关推荐
- 称球问题|信息量|拓展|C++代码实现|12大小一样的球,找出其中质量不一样的球解析和代码实现
直接求解法 条件:天平.12个一样的球,其中一个不一样,用天平找出那个不一样的球并确定轻还是重,最少的次数是:3 将12个球分为三组 A:1 2 3 4 B:5 6 7 8 C:9 10 11 12 ...
- C语言 12个球称3次 找出其中一个坏球
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> ...
- 7个相同小球4个不同盒子_如何用天平称三次找出12个外观相同小球中仅有的一个次品?次品质量与正品不同。...
刷知乎看到这个问题: 12个相同的小球其中有一个质量不同,一个天平,称三次找出这个小球,请问怎么称?www.zhihu.com 为了给出通俗易理解的答案,写了这个文章,祝题主有情人终成眷属! 先祭出 ...
- 三个球A,B,C大小形状相同,且其中有一个球与其他球的重量不同,要求找出这个不一样的球
import java.util.Arrays; import java.util.Scanner;/*** @author silence丶黎明* 三个球A,B,C大小形状相同,且其中有一个球与其他 ...
- 数据结构第5章例题 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。
[例5.1] 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点.试编写一个算法,找出A中的所有鞍点. 算法如下: void saddl ...
- 找出1-1000中的所有完美数
再次练习查找完美数,找出 1-1000 中的所有完美数. [学习的细节是欢悦的历程] Python 官网:https://www.python.org/ Free:大咖免费"圣经" ...
- java数组出现次数最多的数_找出数组中出现次数最多的那个数——主元素问题...
方法一:以空间换时间,可以定义一个计数数组int count[101],用来对数组中数字出现的次数进行计数(只能针对数组中数字的范围1~100),count数组中最大的元素对应的下标,即为出现次数最多 ...
- 找出数组中重复的数字---多思路
问题:找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...
- 如何找出R中加载的软件包版本?
本文翻译自:How to find out which package version is loaded in R? I am in a process of figuring out how to ...
最新文章
- 为什么很多程序员工作时都戴耳机?
- 使用python创建自己的第一个神经网络模型吧!
- python cgitb_python CGI 编程实践
- php将配置信息写入文件,Php写入配置文件的经典漏洞
- 五行代码快速使用python的turtle库绘画
- Ubuntu中文输入法崩溃问题(候选框乱码)
- 【科研绘图】Visio保存为PDF时去掉黑框
- 「SVN」Linux下svn使用命令
- 闲聊位置之 POI数据
- ruby array_在Ruby中使用Array.delete()和Array.delete_at()从Array中移除元素
- java对list里面按照分数排名_提前批警校排名,部属警校去省厅,省级警校去乡镇吗...
- Java添加水印+图片水印+文字水印
- 声压级和灵敏度的关系
- 分享思路:Python+Spark爬虫音乐推荐系统 音乐数据分析可视化 音乐推荐app 音乐网站 大数据毕业设计(app+web+爬虫+spark+可视化)
- vector subscript out of range
- wait-ify工作原理(学习笔记)
- 【移动光猫H2-2的完全破解心路历程及配置】
- 思岚科技邀你2017日本东京国际机器人展
- Haskell语言学习笔记(73)Existentials
- 网约车风云再起:“小窗口”和“大窗口”齐开