问题描述:有只猴子在树林采了100根香蕉堆成一堆,猴子家离香蕉堆50米,猴子打算把香蕉背回家, 每次最多能背50根,可是猴子嘴馋,每背一米要吃一根香蕉,问猴子最多能背回家几根香 蕉?
我的理解是返回背香蕉时 不吃香蕉 (否则这个问题没法解决)
在网上看到一个上述小学题目,议论纷纷,想了一下得到的答案是每次走25m剩下25个,网上评论一看,大多是这个思路,但我觉得不只一种答案,于是在刚好在学java,就随手把这个问题实现了下,结果是什么呢?
public class TestMonkey {
public static void main(String[] args) {
// TODO 测试猴子背香蕉最佳方案
ArrayList<CountNum> arr=new ArrayList<CountNum>();
int allCount;
int left=0; //不能整除剩余米数
int count=0;//所走段数
for (int i = 1; i <=50; i++) {
allCount=100;
count=50/i;
left=50%i;
for (int j = 1; j <=count; j++) {
if(allCount>50){//大于50时,要背两次
allCount-=i*2;
}else if(allCount>0){ //小于50大于0 背一次
allCount-=i;
}else{
break;
}
}
//不能整除时, 剩下的余数 所背米数
if(left!=0){
allCount-=left;
}
arr.add(new CountNum(i, allCount));
if(allCount>Best.BEST.value){
Best.valueOf("BEST").Setv(allCount);
}
}
for (CountNum c: arr) {
if(c.getAllcount()==Best.BEST.value)
System.out.println("方案"+c.getI()+"\t每次背"+c.getI()+"m \t剩下"+c.getAllcount()+"根香蕉\t 最佳");
}
}
}
class CountNum{
private int i; //每次所背米数
private int allcount;//剩下香蕉数
public CountNum(int i, int allcount) {
this.i = i;
this.allcount = allcount;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public int getAllcount() {
return allcount;
}
public void setAllcount(int allcount) {
this.allcount = allcount;
}
小小枚举 小公举
public enum Best{
BEST(0);
private int value;
Best(int value){
this.value=value;
}
public int value(){
return value;
}
public void Setv(int v){
this.value=v;
}
}
**运行结果
方案1 每次背1m 剩下25根香蕉 最佳
方案5 每次背5m 剩下25根香蕉 最佳
方案25 每次背25m 剩下25根香蕉 最佳**
这是我的理解,如有不同意见,欢迎提出讨论!