算法分析:
现有八枚银币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>