12球称重问题, 算法及其他

数学分析: http://blog.tianya.cn/blogger/post_show.asp?BlogID=2499219&PostID=20677715  

代码实现:  http://blog.csdn.net/cifry/article/details/1912384

        第一:有12个外观完全一样的球;
  第二:11个是好球,重量相同;
  第三:有一个球是“坏球”,重量与其他11个球异常,但不知偏轻偏重!
  第四:有一架天平,无砝码;
  
  问:怎样用该天平称量3次,找出重量异常的球!

============================================================================

先论证可行性:

再来看看牛人的解答吧,从另一个角度看东东,特别牛!!!
  
  从信息论来看,12个球一个重量异常,出现概率1/12;该球质量可能轻也可能重,那么出现概率为1/2。
  那么要得到结果所需信息量为log2+log12。
  称一次可能有轻、重、相等三种结果,信息量为log3。log24/log3<3,三次应该能称出来。
  
  信息论运用到这种地步,实在是精辟啊。

 

(说实话,本人只看得懂一部分,信息论好强。)
  
  (参见 David J.C. MacKay 的“Information Theory, Inference, and Learning Algorithms”)
  
  首先考察一个这个题目的性质。
  
  要求从12个球中找出一个次品球来可以归结为一种态空间的搜索。
  12个球可以具有很多状态,
  例如第一个球是重球,而其它球是正常球,
  或者第三球是轻球,而其它球是正常球。
  12个球,每个球都可能是重球或者轻球,所以共有24个可能的状态。
  标记为1+, 1-, 2+, ..., 12+, 12-。
  注意这里我们已经省略了对正常球的描述,而认为它们是一种背景情况。
  
  我们的任务是确定12个球到底处在这24种状态的哪一个。
  
  
  再来看看我们所具有的搜索手段。
  我们只有一架天平,可以将其看作一种指标函数,
  其输出有三种:左重右轻,左轻右重,平衡。
  
  所以一次称量我们可以在态空间中进行一次三分操作,
  而将搜索空间缩小到态空间中的某一部分。
  
  考虑到最坏的情况,每次我们都可能落入较大的搜索空间,
  所以应该尽量进行三等分。
  
  举个例子,
  □□□□□□X□□□□□□□□□□Y□□□□□□□□□□Z
  □□□□1+ 2+ 3+ 4+□□□□5+ 6+ 7+ 8+ □□□□9+ 10+ 11+ 12+
  □□□□1- 2- 3- 4-□□□□5- 6- 7- 8- □□□□9- 10- 11- 12-
  
  
  如果我们称量X和Y, 如果平衡,则次品球必在Z中。
  如果 X > Y,则我们可以排除X中的1-,2-,3-,4-以及Y中的5+,6+,7+,8+等状态。
  无论如何,最终只会剩下8个待选状态。
  
  最后明确一下我们在继续称量的过程中需要注意的问题:如何才能最大限度的获取信息。
  
  假设 X > Y, 则剩下1+ 2+ 3+ 4+ 5- 6- 7- 8-这8个状态。
  继续称量必须将这8个状态打乱放置到天平两侧,而且要注意到尽量均衡。
  
  比如说我们现在选择称量1+和5-。
  显然,现在的结果只能是左重右轻或者平衡,因为根据我们的知识可以排除左轻右重的情况。
  而如果比较1+和2+,我们仍然可以得到三种情况。
  
  只有在先验上我们认为两者绝对无法区分的情况下,比较才具有最大的意义。
  
  具体如何称量下去,这里不讲了。只是强调一点,信息是我们意料之外的事情,这是信息论的要点。

 

最后,说一下如何称13个球吧。不过,只能找出来,不能保证知道坏球是轻是重。
  
  还是分三组,A、B、C,C组5个球(C1,C2,C3,C4,C5)
  
  第一次,还是称量 A :::: B;如果不相等,嘿嘿,和称12个球完全一样了!
  
  如果 A == B,都是好球,C中有“坏球”;
  
  很简单,
  第二次,(A1,A2,A3)::::(C1,C2,C3)称量;
  
  如果,==,(C4,C5)有“坏球”,随便哪一个与A1称即可;
  如果,>,(C1,C2,C3)中有“坏球”,且坏球轻,再C1和C2称,即可;
  如果,<,(C1,C2,C3)中有“坏球”,且坏球重,再C1和C2称,即可;

 

最后,对信息论的一点儿补充,权当给各位参考:
  
  1)13球问题, 一共有26种可能的情况;
  2)天平一次称量结果有3种情况(左偏,平衡,右偏), 3次称量最多有3^3=27种情况。
  
  这说明3次确定出这26种情况是“有可能”的!

=============================================================================

 

 

  答案很多种,也都很精彩!
  
  正确的都是分成三组:A(A1,A2,A3,A4)、B(B1,B2,B3,B4)、C(C1,C2,C3,C4)
  
  如果不分三组,嘿嘿,那肯定不对!

 

  第一种方法:(分三组,A、B、C,各四个球)
  
  (1)第一次:A :::: B,两组称量;
   如果,A == B,A、B 组是好球,C 组(C1,C2,C3,C4)中有“坏球”;
  
  (2)----第二次:(A1,A2)::::(C1,C2),称量; (这里只用了两个球称量!!!! )
  
   ----如果,(A1,A2)==(C1,C2),说明(C3,C4)中有“坏球”;
  
   --------第三次:A1 :::: C3,称量;
   --------如果,A1 == C3,说明 C3 是好球,结论是:C4 是“坏球”;
   --------如果,A1 != C3,说明 C4 是好球,结论是:C3 是“坏球”;
  
   ----如果,(A1,A2)!=(C1,C2),说明(C1,C2)中有“坏球”;
  
   --------第三次:A1 :::: C1,称量;
   --------如果,A1 == C1,说明 C1 是好球,结论是:C2 是“坏球”;
   --------如果,A1 != C1,说明 C2 是好球,结论是:C1 是“坏球”;
  
  
  (3)如果,A != B,肯定 C 组是好球,
   ----有两种情况:(左)A > B(右)(A重),或 A < B(A轻);
  
   ----以“A > B(A重,左 > 右)”为例,进行操作;
  
   ----第二次:天平左侧,A 组留1个球,与 B 组3个球配成一组;
   ---- 天平右侧,B 组还剩1个球,与 C 组3个球配成一组;
  
   ---- 即:(A1,B1,B2,B3)::::(B4,C1,C2,C3),称量;
  
  
   ----此时,将出现三种情况,左 == 右,左 > 右,左 < 右;
  
   ----如果,左 == 右,那么,问题球肯定在(A2,A3,A4)中,
   ---------------- 且因为(A重)为例,说明“坏球”是重的;
  
   --------第三次:A2 :::: A3,称量;
   --------如果,A2 = A3,都是好球,结论是:A4 是“坏球”;
   --------如果,A2 > A3,结论是:A2 是“坏球”,且重;
   --------如果,A2 < A3,结论是:A3 是“坏球”,且重;
  
  
  
   ----如果,左 > 右,(B1,B2,B3)移动后,未引起变化,是好球,
   ---------------- 问题球就是(A1,B4),要么A1重,要么B4轻;
  
   --------第三次:C1 :::: A1,称量;
   --------如果,C1 = A1,都是好球,结论是:B4 是“坏球”,且轻;
   --------如果,C1 < A1,结论是:A1 是“坏球”,且重;
  
  
  
   ----如果,左 < 右,说明(B1,B2,B3)移位后,引起变化,有坏球,
   ---------------- 问题球在(B1,B2,B3)中,且“坏球”较轻;
  
   --------第三次:B1 :::: B2,称量;
   --------如果,B1 = B2,都是好球,结论是:B3 是“坏球”,且轻;
   --------如果,C1 < A1,结论是:A1 是“坏球”,且重;

 

==========================================================================

 其实,这道题的解法还有多种,
  
  分别是对“第一种方法”中的(2)、(3)进行变化。
  
  先说简单的:(2)的变化
  
  前提是:第一次称量,A == B;
  
  
  
  变化一
  
  第二次称量:(A1,A2,A3)::::(C1,C2,C3);
  
  如果,==,那么,C4是“坏球”,想知轻重,与 A1 称一下即可;
  
  如果,>,那么,(C1,C2,C3)中有坏球,坏球为轻;
   --------第三次称量,C1 :::: C2,
   --------如平衡,C3是“坏球”,不平衡,轻的是“坏球”;
  
  如果,<,那么,(C1,C2,C3)中有坏球,坏球为重;
   --------第三次称量,C1 :::: C2,
   --------如平衡,C3是“坏球”,不平衡,重的是“坏球”;
  
  
  
  变化二
  
  第二次称量:(A1,C1)::::(C2,C3);
  
  如果,==,那么,C4是“坏球”,想知轻重,与 A1 称一下即可;
  
  如果,>,那么,(C1,C2,C3)中有坏球,要么C1重,要么C2或C3轻;
   --------第三次称量,C2 :::: C3,
   --------如平衡,C1是“坏球”,且重;不平衡,轻的是“坏球”;
  
  如果,<,那么,(C1,C2,C3)中有坏球,要么C1轻,要么C2或C3重;
   --------第三次称量,C2 :::: C3,
   --------如平衡,C1是“坏球”,不平衡,重的是“坏球”;
  
  
  
  补充说明:这两种变化,比之前的要好,可以知道“坏球”的轻重!
  
  第一种方法中的(2),
  有可能三次称量后,只能判断哪个是“坏球”,却不知是轻是重!

  

你可能感兴趣的:(c,算法,任务)