一道比较简单的笔试题“捞鱼” 有10个鱼缸,每个鱼缸有10条鱼。现在你去每个鱼缸里捞一次,每次可能捞到10条,也可能1条都捞不到。 问:捞到90条鱼,有多少种可能。编写一函数Count(),计算一共有多少种可能。请问,有没有什么比较牛的方法实现?怎么用面向对象的思想实现呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 92378public 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); } } }} 我的比较麻烦一下,主要是为了把每一种方案打印出来.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; } } 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种可能! 题目要求:编写一函数Count(),计算一共有多少种可能。 至少应该有int count(){return XXXX;}或long count(return XXXX;)这个方法吧。 结合,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()+"种可能!"); }} 觉得5楼很牛B,几乎每天没有离开过csdn 关于corba中持久poa 长连接的PreparedStatement执行完是否要关闭? 【弱问】一个很基础的事,JAVA为什么要用javabean? java Selector 序列话问题(困扰很久) 显示一个表,weblogic运行结构与Tomcat、WebSphere效果不同。----请高手指教 java如何批量读取文件 一个大公司的笔试题,希高手解答一下 怎样用java来创建access数据库(mdb文件)?急? 有什么好的方法让服务器socket监听数据更新呢 大神救命 关于JAVA获取MAC地址和JNI的问题 Java 参数传输问题(非标题党)
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);
}
}
}
}
//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;
}
}
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种可能!
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()+"种可能!");
}
}