穿越沙漠问题---递推法

一、问题描述

一辆吉普车来到1000km宽的沙漠边沿。吉普车的耗油量为1L/km,总装油量为500L。显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的。假设在沙漠边沿有充足的汽油可供使用,那么吉普车应在哪些地方、建多大的临的加油点,才能以最少的油耗穿过这块沙漠?

二、问题解析

以最少的油耗穿过   油耗要求最少,则意味着该车从起点到达终点时各临时加油点的油量全部使用完毕,没有浪费;在每个加油点加油都需要加满500L,因此可知每个加油点的存储油量都会是500的整数倍。

倒推法进行推导   根据题意,起点油量充足,到达终点时汽油应该刚好使用完,则距终点第一个加油站容量500L,距终点距离500km;则距终第一个加油站油量运送由距终第二个加油站负责,500L汽油需要运送2次(装油量为500L),则经过两点的距离3次,则距终第二个加油站油量= 路上消耗油量+距终第一个加油站油量;往后依次类推

图示如下:

第一次:V1 = 500L 距B为500KM

第二次:V2 =3 * X+V1= 2 * 500 ==> X = 500/3 KM,距B为 (1+1/3) * 500 KM

第三次:V3 =5 * X+V2 = 3 * 500 ==> X = 100 KM,距B为 (2+1/3)*500 KM

图与上类似,省略咯!

第i次:Vi = (2i-1)Xi + Vi-1 = i * 500 ==> x = (v2 - v1) / (2*i - 1);

三、代码示例

void acrossDesert() {

int i = 0;//加油点数量(从终点开始算)

double v1 = 0, v2 = 0;//加油点油量

double d = 0;//距终点距离

double x = 0;//各加油点之间距离

double xx = 0;//起点矫正量

double totalOil = 0;//总油耗

while (d < 1000) {

//Vi = (2i-1)Xi + Vi-1 = i * 500(推导公式)

i++;

v1 = (i - 1)* 500;//上一个加油点存储油量

v2 = i * 500;//本加油点存储油量

x = (v2 - v1) / (2*i - 1);//加油点距离公式

d += x;//累加至距终点距离

totalOil += (2 * i - 1)*x;

if (d > 1000) {//起点固定 进行矫正

xx = d - 1000;

d = 1000;

}

cout << "距起点"<< (1000-d)<

}

totalOil -= xx*(2*i-1);//矫正为xx公里,根据推到的公式本应行经(2*i-1)次

cout << "总耗油量:" << totalOil;

}

结果:

穿越沙漠问题c语言算法,穿越沙漠问题---递推法相关推荐

  1. 常见算法思想2:递推法

    递推法 递推算法犹如稳重的有经验的老将,使用"稳扎稳打"的策略,不断利用已有的信息推导出新的东西. 在日常应用中有如下两种递推算法: (1)顺推法:从已知条件出发,逐步推算出要解决 ...

  2. 算法笔记方法论3 递推法与递归法

    你站在桥上看风景看风景的人在楼上看你明月装饰了你的窗子你装饰了别人的梦--卞之琳 递推算法的特点 一个问题的求解需要大量重复计算,在已知的条件和所求问题之间总存在着某种相互联系的关系,在计算时,我们需 ...

  3. 2.3 基本算法之递归变递推 1188 菲波那契数列(2) python

    http://noi.openjudge.cn/ch0203/1760/ """2.3 基本算法之递归变递推 1188 菲波那契数列(2)--3分 http://ybt. ...

  4. 2.3基本算法之递归变递推 1188 菲波那契数列(2)

    http://noi.openjudge.cn/ch0203/1760/ /* 2.3基本算法之递归变递推 1188 菲波那契数列(2) http://ybt.ssoier.cn:8088/probl ...

  5. 2.3 基本算法之递归变递推 放苹果 python

    http://noi.openjudge.cn/ch0203/666/ """ 2.3 基本算法之递归变递推 666 放苹果 http://noi.openjudge.c ...

  6. 2.3基本算法之递归变递推_3525上台阶

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1190 /* 2.3基本算法之递归变递推_3525上台阶 http://noi.openjudge.cn ...

  7. 2.3基本算法之递归变递推_3525上台阶 python

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1190 """ 2.3基本算法之递归变递推_3525上台阶 http:// ...

  8. 递推法 c语言,递推法

    递推算法 给定一个数的序列H0,H1,-,Hn,-若存在整数n0,使当n>n0时,可以用等号(或大于号.小于号)将Hn与其前面的某些项Hi(0 递推算法是一种简单的算法,即通过已知条件,利用特定 ...

  9. C/C++程序设计常用算法——递推法

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善. 资料仅供学习交流使用. 作者:Aliven888 1.简述 ...

  10. 银行存款(C语言,递推法)

    题目: 母亲为儿子sun 4年的大学生活准备了一笔存款,方式是整取零存,规定sun 每个月月底取下一个月的生活费.假设银行年利息为1.71%,计算该母亲每个月至少要存入多少钱? 算法分析: 可采用逆推 ...

最新文章

  1. 大数相乘--极简单的思路
  2. c语言字符串 数字转换函数大全
  3. Laravel 中简约而不简单的 Macroable 宏指令 1
  4. 【多线程】多线程锁住的是什么、std::lock_guard<std::mutex> locker(mutex_)
  5. 隐藏模块(无模块注入)
  6. SecureCRT的快捷键
  7. OpenGL tessellatedcube棋盘格立方体的实例
  8. 洛谷——P1547 Out of Hay
  9. Relaltek声卡在UBUNTU下没有声音的解决方法。
  10. Java Enumeration接口与Iterator接口
  11. 大江大河,随笔观后感
  12. MySQL的timestamp类型自动更新问题
  13. Kickfire Enters into MySQL Enterprise Agreement with Sun
  14. 【转】Ubuntu下配置支持Windows访问的samba共享
  15. html中ajax检测用户名实例,利用Ajax检测用户名是否被占用的完整实例
  16. 解决eclipse安装maven的问题:Unable to update index for central
  17. 初探强化学习(11)Dyna类型的强化学习
  18. CTF_RSA_N不互素
  19. Selenium中的By模块
  20. 公交卡管理系统C语言,关于NFC不能刷公交卡的研究(暂无方法)

热门文章

  1. [转载] vim风格设置
  2. Go - 访问C动态分配数组
  3. Spring支持的常用数据库事务传播属性和事务隔离级别
  4. yagmail发送附件
  5. MySQL 入门(五)—— 表的操作
  6. 个人对游戏加速器行业看法(一):概念介绍
  7. 安卓rom制作教程_刹那 刷机教程20-1三星S10 N10等系列 韩版国行安卓9升级10 详细步骤...
  8. linux下fish配置终端,如何在Linux中安装、配置和使用Fish Shell?
  9. Linux命令九---Linux进程管理命令---ps-kill-nohup-jobs-fg-bg-top等
  10. python编辑程序用print函数输出中国加油武汉加油_python练习1之print函数