算法-猴子搬香蕉

算法-猴子搬香蕉

2018年01月28日 19:59:15

阅读数:220

问题描述:

一个小猴子边上有100根香蕉,它要走过50米才能到家,每次它最多搬50根香蕉。它每走1米就要吃掉一根,请问它最多能把多少根香蕉搬到家里呢?

提示:他可以把香蕉放下往返的走,但是必须保证它每走一米都能有香蕉吃。也可以走到n米时,放下一些香蕉,拿着n根香蕉走回去重新搬50根。

程序实现:

接口:
  1. public interface MonkeysMoveBananas {

  2.  

  3.  

    /**

  4.  

    *

  5.  

    * @param num 总数量 如100

  6.  

    * @param maxNum 每次最多搬多少个 如50个

  7.  

    * @param distance 距离 如50

  8.  

    * @param eatNum 每走一米吃的数量, 如1个

  9.  

    *

  10.  

    * @return 到家剩余的数量,或者无法再搬香蕉时剩余的数量

  11.  

    *

  12.  

    */

  13.  

    int Move(int num, int maxNum, int distance, int eatNum);

  14.  

    }

实现类:
  1. /**

  2.  

    * @category 猴子搬香蕉问题

  3.  

    * @author song

  4.  

    */

  5.  

    public class MonkeysMoveBananasImpl implements MonkeysMoveBananas {

  6.  

  7.  

    /**

  8.  

    *

  9.  

    * @param num 总数量 如100

  10.  

    * @param maxNum 每次最多搬多少个 如50个

  11.  

    * @param distance 距离 如50

  12.  

    * @param eatNum 每走一米吃的数量, 如1个

  13.  

    *

  14.  

    * @return 到家剩余的数量,或者无法再搬香蕉时剩余的数量

  15.  

    *

  16.  

    */

  17.  

    @Override

  18.  

    public int Move(int num, int maxNum, int distance, int eatNum) {

  19.  

  20.  

    /* 已经搬到的位置, 即搬了几米 */

  21.  

    int location = 0;

  22.  

  23.  

    /* 每次搬运起始点剩的数量 */

  24.  

    int CurrentNumberS = num;

  25.  

  26.  

    /* 每次搬运终点剩的数量 */

  27.  

    int CurrentNumberE = 0;

  28.  

  29.  

    /* 外层循环一次, 即把所有剩余香蕉移动一个位置 */

  30.  

    while(location < distance && CurrentNumberS > eatNum) {

  31.  

    System.out.println("当前所在位置" + location + "有" + CurrentNumberS + "个香蕉");

  32.  

  33.  

    /* 内层循环一次, 即把剩余香蕉移动一个位置, 是移动一个位置的具体细节 */

  34.  

    while (true) {

  35.  

  36.  

    if(CurrentNumberS > maxNum) {

  37.  

    MoveOnePosition(location, location+1, maxNum, eatNum);

  38.  

    CurrentNumberS -= maxNum;

  39.  

    CurrentNumberE += maxNum -eatNum;

  40.  

    } else {

  41.  

    MoveOnePosition(location, location+1, CurrentNumberS, eatNum);

  42.  

    CurrentNumberE += CurrentNumberS - eatNum;

  43.  

    CurrentNumberS = 0;

  44.  

    }

  45.  

  46.  

    /* 看需不需要搬起点剩下的, 即需不需要返回 */

  47.  

    if(CurrentNumberS >= eatNum * 2) {

  48.  

    MoveOnePosition(location+1, location, -1, eatNum);

  49.  

    CurrentNumberE -= eatNum;

  50.  

    } else {

  51.  

    break;

  52.  

    }

  53.  

    }

  54.  

  55.  

    CurrentNumberS = CurrentNumberE;

  56.  

    CurrentNumberE = 0;

  57.  

    location ++;

  58.  

    }

  59.  

  60.  

    System.out.println("剩余" + CurrentNumberS + "个");

  61.  

    return CurrentNumberS;

  62.  

    }

  63.  

  64.  

    /**

  65.  

    *

  66.  

    * @param from 起始位置

  67.  

    * @param to 目标位置

  68.  

    * @param number 搬的数量

  69.  

    * @param eatNum 搬一米吃的数量

  70.  

    */

  71.  

    private void MoveOnePosition(int from, int to, int number, int eatNum) {

  72.  

    if(number != -1) {

  73.  

    System.out.println("从 " + from + " 位置搬 "+ number + " 个到 " + to + " 位置, 消耗" + eatNum + "个");

  74.  

    } else {

  75.  

    System.out.println("从 " + from + " 位置回到 " + to + " 位置, 消耗 " + eatNum + "个");

  76.  

    }

  77.  

    }

  78.  

    }

测试类:
  1. public class MonkeysMoveBananasTest {

  2.  

  3.  

    private static MonkeysMoveBananas monkeysMoveBananas = null;

  4.  

  5.  

    @BeforeClass

  6.  

    public static void setUpBeforeClass() throws Exception {

  7.  

    monkeysMoveBananas = new MonkeysMoveBananasImpl();

  8.  

    }

  9.  

  10.  

    @Test

  11.  

    public void moveTest() {

  12.  

    int k = monkeysMoveBananas.Move(100, 50, 50, 1);

  13.  

    assertEquals(k, 16);

  14.  

  15.  

    k = monkeysMoveBananas.Move(1000, 50, 50, 2);

  16.  

    assertEquals(k, 20);

  17.  

    }

  18.  

    }

原文地址:https://www.cnblogs.com/timxgb/p/9307479.html

时间: 2024-08-29 15:51:03

算法-猴子搬香蕉的相关文章

硬币找零&&爬楼梯&&猴子摘香蕉

硬币找零&&爬楼梯&&猴子摘香蕉 假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. #include"CoinProblem.h" #include<iostream> int countNum=MAX; void CoinProblem(int *coin,int Length,int Value,int count){ if(Value==0){ if(countNum>count){ c

两个关于数列的Python脚本(斐波那契数列和猴子吃香蕉类问题)

斐波那契数列(Fibonacci sequence),因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列",又因其相邻两项的比无限接近黄金分割比例,所以又称为黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.34.--,即后一项是前两项的和. #!/usr/bin/python #coding:utf-8 #斐波那契数列 x=[0,1] for i in range(int(raw_input('请输入数

逻辑题——飞机加油、硬币平分、猴子摘香蕉

1. 每个飞机只有一个油箱, 飞机之间可以相互加油(注意是相互,没有加油机) 一箱油可供一架飞机绕地球飞半圈.为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场) 步骤如下: (1)3 架飞机同时从机场出发,飞行八分之一周(A点),各耗油四分之一.此时某架飞机给其余两架补满油,自己返回基地: (2)另一架飞机和目标机结伴,飞至四分之一周(B点),给目标机补满油,自己返回: (3)目标机独自飞行半周(C

算法——猴子分桃

想做些有关“算法”的练习题,在网上无意间看到了一道很经典的算法题——猴子分桃,于是百度了一下,才发现这道题的相关文档很多很多,但最多的也就是使用C++或者Java来解决这道题,而自己也是初次接触C++. 1.先介绍一下C++使用最常见的编辑器——dev cpp.附上下载地址:(http://bloodshed-dev-c.en.softonic.com/download); 2.: 3.接着选好所要下载好的地址: 4.剩下的事情就是“一路默认”,直至安装完成. 然后就剩启动Dev C++,启动完

贪心算法之搬桌子问题

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqListSort { /// <summary> /// <ather> /// lihonlin /// </ather> /// <content> /// 搬桌子问题 /// 某教学大楼一层有n个教室,从左到右依次编号为1.2.….n.现在要把一些课桌从某些

c语言经典算法——猴子偷桃问题

题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三.第四.第五只猴子都是这样做的,问海滩上原来最少有多少个桃子? 算法分析://初始桃子数为sum第一次:sum=5*x1+1    第二次:4*x1=5*x2+1第三次:4*x2=5*x3+1第四次:4*x3=5*x4+1第五次:4*x4=5*x5+1第五次分配结束:剩下4*x5个桃子

猴子摘香蕉一次可以摘1个或2个,总共50个,问有多少种摘法?

问题来自知乎 等我写完发现,知乎上都比我写的好,我快哭了!!! 等我写完之后发现不就是那啥啥函数,贴上lua代码 N很大的时候,估计是抗不住了,代码还需要优化. function banana( n ) local c = 1; if n == 0 then return 0 elseif n == 1 then return 1 elseif n == 2 then return 2 end return (banana(n - 1) + banana(n - 2)) * c; end for

PHP树生成迷宫及A*自己主动寻路算法

PHP树生成迷宫及A*自己主动寻路算法 迷宫算法是採用树的深度遍历原理.这样生成的迷宫相当的细,并且死胡同数量相对较少! 随意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自己主动寻路算法 完整代码已上传,http://download.csdn.net/detail/hello_katty/8885779 ,此处做些简单解释,还须要大家自己思考动手.废话不多说,贴上带代码 迷宫生成类: /** 生成迷宫类 * @date 2015-07-10 * @edit http://w

PHP树生成迷宫及A*自动寻路算法

PHP树生成迷宫及A*自动寻路算法 迷宫算法是采用树的深度遍历原理,这样生成的迷宫相当的细,而且死胡同数量相对较少! 任意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自动寻路算法 完整代码已上传,http://download.csdn.net/detail/hello_katty/8885779 ,此处做些简单解释,还需要大家自己思考动手.废话不多说,贴上带代码 迷宫生成类: /** 生成迷宫类 * @date 2015-07-10 * @edit http://www.l