称球问题十几年前就在深圳的一网情深BBS上成为热门问题,此后的十余年间不断有人提起此问题,前段时间还在网上看到有人重新提起此问题,已经成为了新网民的入门级必知必会问题之一。
称球问题一般会有以下
3
种情况:
1 、M个球,其中有一个坏球,知道是轻还是重,用天平称出坏球来。
2、M个球,其中有一个坏球,不知是轻还是重,用天平称出坏球来。
3、M个球,其中有一个坏球,不知是轻还是重,用天平称出坏球来,并告知坏球是轻还是重。
现在要问对于上面3种情况,称k次,最多可以在几个球中找出坏球来?也就是要求出称k次的M的最大值来。
1 、M个球,其中有一个坏球,知道是轻还是重,用天平称出坏球来。
2、M个球,其中有一个坏球,不知是轻还是重,用天平称出坏球来。
3、M个球,其中有一个坏球,不知是轻还是重,用天平称出坏球来,并告知坏球是轻还是重。
现在要问对于上面3种情况,称k次,最多可以在几个球中找出坏球来?也就是要求出称k次的M的最大值来。
第
1
种情况,比较简单,
1
次可以称
3
个球,
2
次可称
9
个球,
k
次可以称
3^k
(
3
的
k
次方)个球。
第
2
种情况就比第
1
种情况复杂多了,
对第
3
种情况,和第
2
种情况类似,知道了第
2
种的解法后,第
3
种自然也就解出来了。
任意个数球的称法
假设有足够正常重量球的情况下称k次可以从最多F(k)个球里找出不知轻重的坏球(称多次的情况下,称完第一次就会有若干正常重量的球了),现在来计算称k+1次的F(k+1)最大可以到多少,在有足够正常重量球的情况下,0次可以称出1个球,1次可以称出2个球。因此F(0)=1,F(1)=2。
按照测试用例设计的元素分析法,先找出其中的元素:天平,若干球
先分析一下这些元素的属性,天平有两端托盘可以放东西,可以根据天平平衡情况判断天平两端放的东西重量是否相等。球的属性主要是重量,正常球重量都相等,坏球重量和正常球不相等。
再用测试用例设计的分类推理法来进行分类,按球的属性是无法分类的,因为每个球的重量都不知道,因此按天平属性来进行分类,可以将球分为三类,放在天平左端托盘中的,放在天平右端托盘中的,没有放入天平托盘的。
任何一个球最终都可以归结到上面分成的三类中,不论将球分成多少堆,最终都可以将其看成只有三堆,一堆要放入天平左端托盘中,一堆要放入天平右端托盘中,一堆不放入天平托盘中。所以分成了
X
,
Y
,
Z
三堆(某堆可以为空)可以看成是唯一的分法。
将F(k+1)个球分成X,Y,Z三堆,先将X,Y放入天平的两端称一下,由于对成性,只需要考虑两种情况:
1
、
X
和
Y一样重
此时只要在
Z
堆中找出坏球就可以了,
Z=F(k)
。
2
、
X
比
Y
重
在称完第
1
次后,此时可以再次使用元素分析法,找出四个元素:天平,
X
,
Y
,
Z
和前面一样可以采用分类推理法根据天平元素的属性将
X
分成
X1
,
X2
,
X3
;
Y
分成
Y1
,
Y2
,
Y3
;
Z
分成
Z1
,
Z2
,
Z3
。由于对称性,可以按以下进行放置:
天平左端放置
X1
,
Y1
,
Z1
天平右端放置
X2
,
Y2
,
Z2
设
G(k) = X+Y
当
X1+Y1+Z1
比
X2+Y2+Z2
重时
,无法判断是
Y2
中有坏球还是
X1
中有坏球,由于对称性,可以假定
Y2
为
0
(球个数为
0
),那么就可以判断出
X1
中有坏球,且坏球比正常球重,此时
X1+Y2=3^(k-1)
。如果
X1
和
Y2
都不为
0
时,可以得到
X1+Y2=G(k-1)
。
当
X1+Y1+Z1
和
X2+Z2
重量相等时
,表明坏球在
X3+Y3+Z3
中,由于此时无法判断坏球是在
X3
还是
Y3
中,如果令其中一个为
0
,那么另一个则为已知重量情况下称
k
-
1
次的最大个数,因此
X3+Y3
最大值为
3^(k-1)
,如果不为
0
,则
X3+Y3=G(k-1)
。
当
X1+Y1+Z1
比
X2+Z2
轻时
,由于此时无法判断坏球是在
Y1
还是
X2
中,并且
X2
比
Y1
重,这和
X
比
Y
重的情况是一样的,那么可以得出
X2+Y1
=
G(k-1)
或者
3^(k-1)
这时有
G(k)
=
X+Y = 3^k
或者
G(k)
=
X+Y = 3
×
G(k-1)
对后面那个等式,可以求出
G(k)
=
3^(k-1)
×
G(1)
,由于
G(1)
的最大值不可能超过
3
综合上面两种情况,
G(k)
取最大值
3^k
由于
Z
堆中球的最大个数是在
X
和
Y
一样重的情况下来求解的,因此这里
Z1
,
Z2
,
Z3
中的球的个数并不重要,前面已经讲过
Z = F(k)
这样可以得到
F(k
+
1) = X+Y+Z = X1+X2+X3+Y1+Y2+Y3+Z
= F(k) +G(k)
=F(k) + 3^k
解出
F(k) = (3^k
-
1) / 2
+
F(1) - (3 - 1)/2 = (3^k
-
1) / 2
+
1
这样求出了有足够标准球情况下称
k
次可以称出的最大值,在没有标准球的情况下,由于称
2
次只能称
4
个球,比有标准球时少一个,因此可以得出称
k
次可以称出的最大值为
max
(
k
)
=
(3^k
-
1) / 2
。
这样
3
次可以称出
13
个球,
4
次可以称出
40
个球
….
。
根据以上的推理过程,可以得出以下的称法:
2
次称
5
个球的称法(有标准球参照
,F(2) = F(1)+3 = 2+3 = 5
)
有标准球时
2
次称
5
个球的称法
将球编号为
1
,
2
,
3
,
4
,
5
,标准球记为
S
将
1
,
2
放入天平的一端,
3
,
S
放入天平的另一端
如果
1
,
2
比
3
,
S
重
,表明坏球在
1
,
2
,
3
中,此时将
1
,
2
放入天平两端称一下,如果重量相等则
3
为坏球,如果不相等则重的那个是坏球。
同理如果
1
,
2
比
3
,
S
轻时
,将
1
,
2
放入天平两端称一下,相等则
3
为坏球,不相等则轻的那个为坏球。
如果
1
,
2
和
3
,
S
一样重
,表明坏球在
4
,
5
里面,取
4
和
S
一起称一下,相等则
5
为坏球,不相等则
4
为坏球。
3
次称
13
个球的称法(无标准球做参考)
将球分为(
1
,
2
,
3
,
4
),(
5
,
6
,
7
,
8
),(
9
,
10
,
11
,
12
,
13
)三组
将(
1
,
2
,
3
,
4
)和(
5
,
6
,
7
,
8
)放入天平两端称一下
如果重量相等
则转换为有标准球做参考在(
9
,
10
,
11
,
12
,
13
)
5
个球里找坏球的问题,上面已经给出了。
如果重量不等
,由对称性不妨设
1
,
2
,
3
,
4
为重的一端
将(
1
,
5
,
6
,
7
)
和
(
8
,
9
,
10
,
11
)一起称一下
如果(
1
,
5
,
6
,
7
)重,则表明坏球在
1
或
8
里面,只要拿一个标准球和
1
或
8
称一下就可以找出坏球
如果两边一样重
,那么坏球在
2
,
3
,
4
里,且坏球为重球,称一次就可以称出
如果(
1
,
5
,
6
,
7
)轻,那么坏球在
5
,
6
,
7
里面,且坏球为轻球,称一次就可以找出。