有10个鱼缸,每个鱼缸有10条鱼。现在你去每个鱼缸里捞一次,每次可能捞到10条,也可能1条都捞不到。
    问:捞到90条鱼,有多少种可能。编写一函数Count(),计算一共有多少种可能。请问,有没有什么比较牛的方法实现?怎么用面向对象的思想实现呢?

解决方案 »

  1.   

    92378
    public class Main{
    private static int fishCount;
    public static void main(String[] args) {
    catchFish(90,1);
    System.out.println(fishCount);
    }
    public static void catchFish(int fish,int count){
    if(fish>10*(10-count+1)){
    return;
    }else if(count==10){
    fishCount++;
    }else if(count<10){
    for(int i=0;i<=10;i++){
    catchFish(fish-i,count+1);
    }
    }
    }
    }
      

  2.   

    我的比较麻烦一下,主要是为了把每一种方案打印出来.import java.util.*;public class Test3{
    //totao: 目标数
    //ounter: 符合条件的抓鱼次序的计数器
    //这两个可以做为count方法的参数,由于count的参数太多了,就用static变量了,但这种办法是不推荐的。
    static final int total=90;
    static int counter=0;
    public static void main(String[] args) {
    System.out.println(count(new int[10],0,0));
    }
    /**递归实现
    *@ param fishBowl 鱼缸,
    *@ param n   从第n个鱼缸抓鱼
    *@ param fish 前n-1个鱼缸抓到的鱼的总数
    */
    public static int count(int[]fishBowl,int n,int fish){
    if(n==fishBowl.length){           //n个鱼缸都抓过鱼了。
    if(fish==total){              //抓到的鱼的总数正好是total。
    counter++;
    System.out.println(Arrays.toString(fishBowl));
    }
    return counter;
    }
    if(10*(fishBowl.length-n)<total-fish){      //如果剩余的鱼缸每个都可以抓到10条鱼,仍然达不到总数,不要再继续了。
    return counter;
    }
    for(int i=0;i<=10;i++){                    //从第n个鱼缸中试着抓0~10条鱼
    if(fish+i<=total){                     //已经抓到的鱼的数目加+第n个鱼缸试着抓的鱼的数目小于总数,则继续。
    fishBowl[n]=i;
    count(fishBowl,n+1,fish+i);         //继续在第n+1个鱼缸中手抓鱼,已经抓到的鱼是fish+i条。
    //System.out.println(Arrays.toString(fishBowl));
    }
    } return counter;
    }

    }
      

  3.   


    package fish;/**有10个鱼缸,每个鱼缸有10条鱼。现在你去每个鱼缸里捞一次,每次可能捞到10条,也可能1条都捞不到。
     *问:捞到90条鱼,有多少种可能。
     *思路:
     *从10个鱼缸捞90条鱼,相当于先从第1个鱼缸中捞取x条鱼,再从剩余的9个鱼缸中捞取90-x条鱼,如此递归
     * @author HuangNing
     */
    public class GainFish {    private final int TOTAL_TANK = 10;  //鱼缸的总数
        private final int ONE_TANK_FISH = 10;//每个鱼缸的鱼的数目
        private final int NEED_FISH = 90; //共需要捞的鱼的数目
        private  long count = 0;  //可能性计数
        public void gainFish(int remainTank,int needFish){
            //终止条件:只剩下一个鱼缸,从最后一个鱼缸中捞取最后的needFish
            if(remainTank == 1){
                count ++;      //可能性计数+1
                return;
            }
            //循环,每个鱼缸都有可能捞0--ONE_TANK_FISH条鱼,用i表示本次捞的鱼数
            for(int i=0;i<=ONE_TANK_FISH;i++){
                //需要保证 “剩余的鱼缸里鱼的总数” 大于等于 “还需要捞的鱼的数目”
                //----通俗的说就是保证剩余的鱼还够捞
                if((remainTank-1)*ONE_TANK_FISH >= (needFish-i)){
                   gainFish(remainTank-1,needFish-i);
                }
            }
        }    public void solve(){
            gainFish(TOTAL_TANK,NEED_FISH);
            System.out.println("共有"+count+"种可能!");
        }    public static void main(String[] args){
               GainFish gf = new GainFish();
               gf.solve();
        }
    }
    共有92378种可能!
      

  4.   

    题目要求:编写一函数Count(),计算一共有多少种可能。 至少应该有int  count(){return XXXX;}或long count(return XXXX;)这个方法吧。
      

  5.   

    结合,10楼所提出的问题和LZ所提到的面向对象,将代码整理了一下:
    package test;/**题目:有10个鱼缸,每个鱼缸有10条鱼。现在你去每个鱼缸里捞一次,每次可能捞到10条,也可能1条都捞不到。
     * 问:捞到90条鱼,有多少种可能。
     *  思路:
     *  用递归算法
     *  从10个鱼缸捞90条鱼,相当于先从第1个鱼缸中捞取x条鱼,再从剩余的9个鱼缸中捞取90-x条鱼,如此递归
     * @author HuangNing
     */
    public class GainFish {
        
        private int totalTank;   //鱼缸的总数
        private int oneTankFish; //每个鱼缸的鱼的数目
        private int needFish;    //共需要捞的鱼的数目
        private long count = 0;  //可能性计数    public GainFish(int totalTank,int oneTankFish,int needFish){
            this.totalTank = totalTank;
            this.oneTankFish = oneTankFish;
            this.needFish = needFish;
        }    public void gainFish(int remainTank,int needFish){
            if(remainTank == 1){ //终止条件:只剩下一个鱼缸,从最后一个鱼缸中捞取最后的needFish
                count ++;        //可能性计数+1
                return ;
            }
          
            for(int i=0;i<=oneTankFish;i++){       //循环,每个鱼缸都有可能捞0--oneTankFish条鱼,用i表示本次捞的鱼数
                if((remainTank-1)*oneTankFish >= (needFish-i)){ //需要保证 “剩余的鱼缸里鱼的总数” 大于等于 “还需要捞的鱼的数目”
                   gainFish(remainTank-1,needFish-i);
                }
            }
        }    public long count(){
            gainFish(totalTank,needFish);
            return count;
        }    public static void main(String[] args){
               GainFish gf = new GainFish(10,10,90);
               System.out.println("共有"+gf.count()+"种可能!");
        }
    }
      

  6.   

    觉得5楼很牛B,几乎每天没有离开过csdn