称球问题的测试解法

 
称球问题十几年前就在深圳的一网情深BBS上成为热门问题,此后的十余年间不断有人提起此问题,前段时间还在网上看到有人重新提起此问题,已经成为了新网民的入门级必知必会问题之一。
称球问题一般会有以下 3 种情况:
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 里面,且坏球为轻球,称一次就可以找出。
  
 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值