八枚硬币

理论:

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

解法

单就求假币的问题是不难,但问题限制使用最少的比较次数,所以我们不能以单纯的迴圈比较来求解,我们可以使用决策树(decision tree),使用分析与树状图来协助求解。

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

完整的比较决策树如下图所示:

 

java实现:

package 经典;

import java.util.Random;

public class Coins {
    public int[] coins=new int[8];

    public Coins(){
        for(int each:coins)
            each=10;
    }
    public void setFake(int weight) {
        coins[new Random().nextInt(8)] = weight;
    }
    public  int findFake(){
        
        if((coins[0]+coins[1]+coins[2])==(coins[3]+coins[4]+coins[5]))
        {
            if(coins[6]==coins[0])
                return 7;
            else 
                return 6;
        }
        else if((coins[0]+coins[3])==(coins[1]+coins[4]))
        {
            if(coins[2]==coins[0])
                return 5;
            else 
                return 2;
        }
        else if((coins[0]+coins[3])==(coins[2]+coins[5]))
        {
            if(coins[1]==coins[0])
                return 4;
            else 
                return 1;
        }
        else
        {
            if(coins[0]==coins[1])
                return 3;
            else 
                return 0;
        }
    }
    

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub 
        Coins coins=new Coins();
        coins.setFake(9);
        System.out.println((coins.findFake()+1));;
    }
}

 

posted @ 2014-10-05 11:37  凡尘里的一根葱  阅读(589)  评论(0编辑  收藏  举报