<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風博客

    春天里,百花香...

    導航

    <2008年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    統計

    公告

    MAIL: junglesong@gmail.com
    MSN: junglesong_5@hotmail.com

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    用遞歸和掃描解決稱球問題

    稱球問題經常是面試中的常客,這里我用遞歸做了一個稱球的程序,貼出來請大家指正。

    代碼下載:
    http://m.tkk7.com/Files/sitinspring/WeighBall20080727160827.zip

    WeighingBall類:
    package com.heyang;

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;

    /**
     * 多個球中有一個較重的,用一架天平將其稱量出來,求如何分配稱球方案使得稱球次數最少。
     * 
    @author: sitinspring(junglesong@gmail.com)
     * @date: 2008-7-26-下午07:51:40
     
    */

    public class WeighingBall{
        
    /**
         * 構造函數
         * 
    @param n 球個數
         
    */

        @SuppressWarnings(
    "unchecked")
        
    public WeighingBall(int n){
            
    // 掃描求一個最小值
            List<WeighingPlan> plans=new ArrayList<WeighingPlan>();
        
            
    for(int i=1;i<=n/2;i++){
                
    int times=weighBall(i,n-2*i);
                
                plans.add(
    new WeighingPlan(i,n-2*i,times));
            }

            
            Collections.sort(plans);
            
    // 打印最小稱量次數方案
            System.out.println(n+"個球的最小稱量次數為"+plans.get(0).getWeighedtimes());
                    
            System.out.println(
    "\t稱量方案有:");
            
    for(WeighingPlan plan:plans){
                System.out.println(
    "\t\t"+plan);
            }

        }

        
        
    /**
         * 分配球
         * 
    @param ballCount
         * 
    @return
         
    */

        
    private int assignBall(int ballCount){
            
            
    if(ballCount<=1){
                
    // 0,1個球直接得出結論
                return 0;
            }

            
    else if(ballCount<=3){
                
    // 2,3個球還需要再稱量一次
                return 1;
            }

            
    else{        
                
    // 重新分配求出最大的數,assignBall和weighBall這兩個函數相互調用就是看能走多深的
                int max=10000;
                
                
    for(int i=1;i<=ballCount/2;i++){
                    
    int times=weighBall(i,ballCount-2*i);
                    
                    
    if(times<max){
                        max
    =times;
                    }

                }

                
                
    return max;
            }

        }

        
        
    /**
         * 稱球
         * 
    @param ballCountOnBalance :天平上的球個數
         * 
    @param ballCountOnTable :剩下的球個數
         * 
    @return
         
    */

        
    private int weighBall(int ballCountOnBalance,int ballCountOnTable){
            
    // 最大稱量次數由球個數大的決定
            int bigger=ballCountOnBalance>ballCountOnTable?ballCountOnBalance:ballCountOnTable;
            
            
    // 稱一次加一次
            return 1+assignBall(bigger);
        }

        
        
    /**
         * 程序入口
         * 
    @param args
         
    */

        
    public static void main(String[] args){
            
    //new WeighingBall(16);;
            for(int i=3;i<27;i++){
                
    new WeighingBall(i);
            }

        }

    }

    WeighingPlan類:
    package com.heyang;

    /**
     * 稱量計劃類
     * 
    @author: sitinspring(junglesong@gmail.com)
     * @date: 2008-7-27-下午03:58:01
     
    */

    public class WeighingPlan implements Comparable{
        
    // 天平左右球個數
        private int countOnBalance;
        
    // 桌上球個數
        private int countOnTable;
        
    // 稱量次數
        private int weighedtimes;
        
        
    public WeighingPlan(int countOnBalance,int countOnTable,int weighedtimes){
            
    this.countOnBalance=countOnBalance;
            
    this.countOnTable=countOnTable;
            
    this.weighedtimes=weighedtimes;
        }

        
        
    public int compareTo(Object obj){
            WeighingPlan another
    =(WeighingPlan)obj;
            
            
    return this.weighedtimes-another.weighedtimes;
        }

        
        
    public String toString(){
            
    return "稱量次數為"+weighedtimes+" 稱量方案為("+countOnBalance+","+countOnBalance+","+countOnTable+")";
        }


        
    public int getCountOnBalance() {
            
    return countOnBalance;
        }


        
    public void setCountOnBalance(int countOnBalance) {
            
    this.countOnBalance = countOnBalance;
        }


        
    public int getCountOnTable() {
            
    return countOnTable;
        }


        
    public void setCountOnTable(int countOnTable) {
            
    this.countOnTable = countOnTable;
        }


        
    public int getWeighedtimes() {
            
    return weighedtimes;
        }


        
    public void setWeighedtimes(int weighedtimes) {
            
    this.weighedtimes = weighedtimes;
        }

    }


    輸出:
    3個球的最小稱量次數為1
        稱量方案有:
            稱量次數為1 稱量方案為(
    1,1,1)
    4個球的最小稱量次數為2
        稱量方案有:
            稱量次數為2 稱量方案為(
    1,1,2)
            稱量次數為2 稱量方案為(
    2,2,0)
    5個球的最小稱量次數為2
        稱量方案有:
            稱量次數為2 稱量方案為(
    1,1,3)
            稱量次數為2 稱量方案為(
    2,2,1)
    6個球的最小稱量次數為2
        稱量方案有:
            稱量次數為2 稱量方案為(
    2,2,2)
            稱量次數為2 稱量方案為(
    3,3,0)
            稱量次數為3 稱量方案為(
    1,1,4)
    7個球的最小稱量次數為2
        稱量方案有:
            稱量次數為2 稱量方案為(
    2,2,3)
            稱量次數為2 稱量方案為(
    3,3,1)
            稱量次數為3 稱量方案為(
    1,1,5)
    8個球的最小稱量次數為2
        稱量方案有:
            稱量次數為2 稱量方案為(
    3,3,2)
            稱量次數為3 稱量方案為(
    1,1,6)
            稱量次數為3 稱量方案為(
    2,2,4)
            稱量次數為3 稱量方案為(
    4,4,0)
    9個球的最小稱量次數為2
        稱量方案有:
            稱量次數為2 稱量方案為(
    3,3,3)
            稱量次數為3 稱量方案為(
    1,1,7)
            稱量次數為3 稱量方案為(
    2,2,5)
            稱量次數為3 稱量方案為(
    4,4,1)
    10個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    1,1,8)
            稱量次數為3 稱量方案為(
    2,2,6)
            稱量次數為3 稱量方案為(
    3,3,4)
            稱量次數為3 稱量方案為(
    4,4,2)
            稱量次數為3 稱量方案為(
    5,5,0)
    11個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    1,1,9)
            稱量次數為3 稱量方案為(
    2,2,7)
            稱量次數為3 稱量方案為(
    3,3,5)
            稱量次數為3 稱量方案為(
    4,4,3)
            稱量次數為3 稱量方案為(
    5,5,1)
    12個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    2,2,8)
            稱量次數為3 稱量方案為(
    3,3,6)
            稱量次數為3 稱量方案為(
    4,4,4)
            稱量次數為3 稱量方案為(
    5,5,2)
            稱量次數為3 稱量方案為(
    6,6,0)
            稱量次數為4 稱量方案為(
    1,1,10)
    13個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    2,2,9)
            稱量次數為3 稱量方案為(
    3,3,7)
            稱量次數為3 稱量方案為(
    4,4,5)
            稱量次數為3 稱量方案為(
    5,5,3)
            稱量次數為3 稱量方案為(
    6,6,1)
            稱量次數為4 稱量方案為(
    1,1,11)
    14個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    3,3,8)
            稱量次數為3 稱量方案為(
    4,4,6)
            稱量次數為3 稱量方案為(
    5,5,4)
            稱量次數為3 稱量方案為(
    6,6,2)
            稱量次數為3 稱量方案為(
    7,7,0)
            稱量次數為4 稱量方案為(
    1,1,12)
            稱量次數為4 稱量方案為(
    2,2,10)
    15個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    3,3,9)
            稱量次數為3 稱量方案為(
    4,4,7)
            稱量次數為3 稱量方案為(
    5,5,5)
            稱量次數為3 稱量方案為(
    6,6,3)
            稱量次數為3 稱量方案為(
    7,7,1)
            稱量次數為4 稱量方案為(
    1,1,13)
            稱量次數為4 稱量方案為(
    2,2,11)
    16個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    4,4,8)
            稱量次數為3 稱量方案為(
    5,5,6)
            稱量次數為3 稱量方案為(
    6,6,4)
            稱量次數為3 稱量方案為(
    7,7,2)
            稱量次數為3 稱量方案為(
    8,8,0)
            稱量次數為4 稱量方案為(
    1,1,14)
            稱量次數為4 稱量方案為(
    2,2,12)
            稱量次數為4 稱量方案為(
    3,3,10)
    17個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    4,4,9)
            稱量次數為3 稱量方案為(
    5,5,7)
            稱量次數為3 稱量方案為(
    6,6,5)
            稱量次數為3 稱量方案為(
    7,7,3)
            稱量次數為3 稱量方案為(
    8,8,1)
            稱量次數為4 稱量方案為(
    1,1,15)
            稱量次數為4 稱量方案為(
    2,2,13)
            稱量次數為4 稱量方案為(
    3,3,11)
    18個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    5,5,8)
            稱量次數為3 稱量方案為(
    6,6,6)
            稱量次數為3 稱量方案為(
    7,7,4)
            稱量次數為3 稱量方案為(
    8,8,2)
            稱量次數為3 稱量方案為(
    9,9,0)
            稱量次數為4 稱量方案為(
    1,1,16)
            稱量次數為4 稱量方案為(
    2,2,14)
            稱量次數為4 稱量方案為(
    3,3,12)
            稱量次數為4 稱量方案為(
    4,4,10)
    19個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    5,5,9)
            稱量次數為3 稱量方案為(
    6,6,7)
            稱量次數為3 稱量方案為(
    7,7,5)
            稱量次數為3 稱量方案為(
    8,8,3)
            稱量次數為3 稱量方案為(
    9,9,1)
            稱量次數為4 稱量方案為(
    1,1,17)
            稱量次數為4 稱量方案為(
    2,2,15)
            稱量次數為4 稱量方案為(
    3,3,13)
            稱量次數為4 稱量方案為(
    4,4,11)
    20個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    6,6,8)
            稱量次數為3 稱量方案為(
    7,7,6)
            稱量次數為3 稱量方案為(
    8,8,4)
            稱量次數為3 稱量方案為(
    9,9,2)
            稱量次數為4 稱量方案為(
    1,1,18)
            稱量次數為4 稱量方案為(
    2,2,16)
            稱量次數為4 稱量方案為(
    3,3,14)
            稱量次數為4 稱量方案為(
    4,4,12)
            稱量次數為4 稱量方案為(
    5,5,10)
            稱量次數為4 稱量方案為(
    10,10,0)
    21個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    6,6,9)
            稱量次數為3 稱量方案為(
    7,7,7)
            稱量次數為3 稱量方案為(
    8,8,5)
            稱量次數為3 稱量方案為(
    9,9,3)
            稱量次數為4 稱量方案為(
    1,1,19)
            稱量次數為4 稱量方案為(
    2,2,17)
            稱量次數為4 稱量方案為(
    3,3,15)
            稱量次數為4 稱量方案為(
    4,4,13)
            稱量次數為4 稱量方案為(
    5,5,11)
            稱量次數為4 稱量方案為(
    10,10,1)
    22個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    7,7,8)
            稱量次數為3 稱量方案為(
    8,8,6)
            稱量次數為3 稱量方案為(
    9,9,4)
            稱量次數為4 稱量方案為(
    1,1,20)
            稱量次數為4 稱量方案為(
    2,2,18)
            稱量次數為4 稱量方案為(
    3,3,16)
            稱量次數為4 稱量方案為(
    4,4,14)
            稱量次數為4 稱量方案為(
    5,5,12)
            稱量次數為4 稱量方案為(
    6,6,10)
            稱量次數為4 稱量方案為(
    10,10,2)
            稱量次數為4 稱量方案為(
    11,11,0)
    23個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    7,7,9)
            稱量次數為3 稱量方案為(
    8,8,7)
            稱量次數為3 稱量方案為(
    9,9,5)
            稱量次數為4 稱量方案為(
    1,1,21)
            稱量次數為4 稱量方案為(
    2,2,19)
            稱量次數為4 稱量方案為(
    3,3,17)
            稱量次數為4 稱量方案為(
    4,4,15)
            稱量次數為4 稱量方案為(
    5,5,13)
            稱量次數為4 稱量方案為(
    6,6,11)
            稱量次數為4 稱量方案為(
    10,10,3)
            稱量次數為4 稱量方案為(
    11,11,1)
    24個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    8,8,8)
            稱量次數為3 稱量方案為(
    9,9,6)
            稱量次數為4 稱量方案為(
    1,1,22)
            稱量次數為4 稱量方案為(
    2,2,20)
            稱量次數為4 稱量方案為(
    3,3,18)
            稱量次數為4 稱量方案為(
    4,4,16)
            稱量次數為4 稱量方案為(
    5,5,14)
            稱量次數為4 稱量方案為(
    6,6,12)
            稱量次數為4 稱量方案為(
    7,7,10)
            稱量次數為4 稱量方案為(
    10,10,4)
            稱量次數為4 稱量方案為(
    11,11,2)
            稱量次數為4 稱量方案為(
    12,12,0)
    25個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    8,8,9)
            稱量次數為3 稱量方案為(
    9,9,7)
            稱量次數為4 稱量方案為(
    1,1,23)
            稱量次數為4 稱量方案為(
    2,2,21)
            稱量次數為4 稱量方案為(
    3,3,19)
            稱量次數為4 稱量方案為(
    4,4,17)
            稱量次數為4 稱量方案為(
    5,5,15)
            稱量次數為4 稱量方案為(
    6,6,13)
            稱量次數為4 稱量方案為(
    7,7,11)
            稱量次數為4 稱量方案為(
    10,10,5)
            稱量次數為4 稱量方案為(
    11,11,3)
            稱量次數為4 稱量方案為(
    12,12,1)
    26個球的最小稱量次數為3
        稱量方案有:
            稱量次數為3 稱量方案為(
    9,9,8)
            稱量次數為4 稱量方案為(
    1,1,24)
            稱量次數為4 稱量方案為(
    2,2,22)
            稱量次數為4 稱量方案為(
    3,3,20)
            稱量次數為4 稱量方案為(
    4,4,18)
            稱量次數為4 稱量方案為(
    5,5,16)
            稱量次數為4 稱量方案為(
    6,6,14)
            稱量次數為4 稱量方案為(
    7,7,12)
            稱量次數為4 稱量方案為(
    8,8,10)
            稱量次數為4 稱量方案為(
    10,10,6)
            稱量次數為4 稱量方案為(
    11,11,4)
            稱量次數為4 稱量方案為(
    12,12,2)
            稱量次數為4 稱量方案為(
    13,13,0)

    posted on 2008-07-27 00:11 sitinspring 閱讀(1202) 評論(2)  編輯  收藏 所屬分類: 算法數據結構

    評論

    # re: 用遞歸和掃描解決稱球問題 2008-07-28 01:10 yegong

    沒這么簡單
    最簡單的秤球問題有兩種
    1. 有一壞球,不知輕重,此外還有一標準球
    2. 有3個球,知到壞球輕還是重

    簡單的這樣劃分個數是沒有意義的
    至少要給出每一步左右盤上的編號  回復  更多評論   

    # re: 用遞歸和掃描解決稱球問題 2008-07-28 09:31 Jacky-Q

    已知異常球是過重還是過輕的情況下,稱量次數是logN/log3,這個算是標準答案了。  回復  更多評論   

    sitinspring(http://m.tkk7.com)原創,轉載請注明出處.
    主站蜘蛛池模板: 亚洲VA中文字幕无码毛片| 精品国产免费一区二区| 亚洲七七久久精品中文国产| 亚洲日韩精品无码专区加勒比☆| 希望影院高清免费观看视频| 精品亚洲aⅴ在线观看| 免费毛片a线观看| 亚洲bt加勒比一区二区| 国产免费阿v精品视频网址| 国产精品亚洲片在线观看不卡| 三级黄色在线免费观看| 亚洲∧v久久久无码精品| 99ee6热久久免费精品6| 亚洲人成人77777网站不卡| 在线观看免费人成视频色9| 亚洲天然素人无码专区| 免费a级毛片无码av| 中文字幕在线免费视频| 亚洲一级二级三级不卡| 日本最新免费网站| 亚洲中文精品久久久久久不卡| 国产精品免费视频网站| 成年免费a级毛片免费看无码| 国产亚洲AV无码AV男人的天堂| 最近中文字幕免费完整| 亚洲色欲色欲www在线播放| 四虎影视精品永久免费网站| 成人妇女免费播放久久久| 蜜芽亚洲av无码精品色午夜| 大地资源免费更新在线播放| 污网站在线免费观看| 亚洲AV区无码字幕中文色| 三年片在线观看免费观看高清电影| 亚洲AV成人无码网站| 亚洲日韩精品无码专区网址| 精品国产污污免费网站aⅴ| 婷婷国产偷v国产偷v亚洲| 亚洲国产精品无码久久久秋霞2| 99无码人妻一区二区三区免费| 又硬又粗又长又爽免费看| 亚洲色图黄色小说|