八枚硬币求解假币


算法分析:

现有八枚银币a,b,c,d,e,f,g。已知其中一枚是假币,其重量不同于真币,但是不知谁轻谁重,如何使用天平以最少的比较次数,决定哪枚是假币,并得知真币和假币谁轻谁重。

要求以最少的比较次数,我们不能使用单纯的回圈比较来求解,我们可以使用决策树, 具体决策树算法原理可以查看这篇文章~

http://www.cnblogs.com/bourneli/archive/2013/03/15/2961568.html

一个简单的情况是这样的,我们比较a+b+c和d+e+f的重量,如果相等,则假币必是g和h,我们再比较g和h的轻重,如果g较重,再与a比较(a是真币),如果g等于a,则g为真币,h为假币,由于h比g轻,而g是真币,则假币的重量比真币轻。


算法如下:

     

 <span style="font-family:Microsoft YaHei;"> functioncompareheight($coins,$i,$j,$k){
              if($coins[$i] >$coins[$k]){
                     echo "假币".($i+1)." 较重";
              }else{
                     echo "假币".($j+1)." 较轻";
              }
       }
       functioneightcoins($coins){
              if($coins[0] +$coins[1] + $coins[2] == $coins[3] + $coins[4] + $coins[5]){
                     if($coins[6]> $coins[7]){
                            compareheight($coins,6,7,0);//将其与第一枚真币比较
                     }else{
                            compareheight($coins,7,6,0);
                     }
              }else if($coins[0] +$coins[1] + $coins[2] > $coins[3] + $coins[4] + $coins[5]) {
                     if($coins[0]+ $coins[3] == $coins[1] + $coins[4]){
                            compareheight($coins,2,5,0);
                     }elseif($coins[0] + $coins[3] > $coins[1] + $coins[4]){
                            compareheight($coins,0,4,1);
                     }else{
                            compareheight($coins,1,3,0);
                     }
              }else if($coins[0] +$coins[1] + $coins[2] < $coins[3] + $coins[4] + $coins[5]){
                     if($coins[0]+ $coins[3] == $coins[1] + $coins[4]){
                            compareheight($coins,5,2,0);
                     }elseif($coins[0] + $coins[3] > $coins[1] + $coins[4]){
                            compareheight($coins,3,1,0);
                     }else{
                            compareheight($coins,4,0,1);
                     }
              }
       }
</span>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值