您的位置:首页 > 其它

八枚硬币求解假币

2015-08-07 14:57 417 查看
算法分析:

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

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

/article/4912240.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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: