一、问题描述

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

二.问题分析

1.为使油量消耗最少:每次出发的时候,汽车的装油量必须装满,所以每一个加油点的存油量都是汽车总装油量500L的整数倍,即500k

2.从终点倒推考虑:如果从开始点考虑的话,由于很难确定它的第一个加油点的位置,所以我们从终点出发,因为要使油耗最少,所以最后一个加油站设置的位置在距离终点500km的位置,这样最后一次刚好走完整个沙漠。

图示如下:

第一次: c1 = 500L(指的是c1至少要存储500L) 距B为500KM

现在我们知道了倒数第一个加油点的位置,该加油点必须存储500L的油量(即k的值为1),要从倒数第二个加油点传送500L油量给倒数第一个加油点,至少要传送两次才行(因为汽车往返要耗油,每次不能直接传500L),假设倒数第二个加油点到倒数第一个加油点的距离为Xkm,传送两次,汽车从倒数第二个加油点传油到倒数第一个加油点需要行走3倍的x距离(即3xkm),车子耗油量也是3x L,由于还要传送500L油,所以倒数第二个加油点的存油至少500+3X L,又由于每一个加油点的存量必须是500的k倍且要保证汽车油耗最少,所以取k=2,即倒数第二个加油点的存油为1000L,所以500+3x=500*2,可以得出X=500/3 km

倒数第二个加油点到倒数第一个加油点的距离为x=500/3 ,图示如下:

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

现在计算倒数第三个加油点到倒数第二个加油点的距离,跟上面求解步骤一样,假设倒数第三个加油点到倒数第二个加油点的距离为Xkm,要从倒数第三个加油点传送1000L油量给倒数第二个加油点,至少要传三次才行,汽车从倒数第三个加油点传油到倒数第二个加油点需要行走5倍的x距离(即5xkm),车子耗油量也是5x L,由于还要传送1000L油,所以倒数第三个加油点的存油至少1000+5X L,所以k=3,即1000+5x=500*3,所以倒数第三个加油点到倒数第二个加油点的距离为x=500/5 ,倒数第三个加油点到倒数第一个加油点的距离为x=500/5,以此类推

第i次:ci = (2i-1)xi+ Ci-1 = i * 500 ==> x = (Ci-Ci-1) / (2*i - 1)=500 / (2*i - 1);

三. c语言源码

#include <stdio.h>
int main()
{double dis = 500,oil=500;   //油量和距离终点的距离int k = 1;  //初始倍数为1//因为不确定循环次数,又至少做一次,所以我们用do_whiledo{printf("储油点%d:距离出发点%.2lf,",k,1000-dis);    //距离开始点的距离  printf("储油量%d\n",(int)oil);k = k+1;     //倍数dis = dis +500.00/(2*k-1);  //dis是距离终点的距离oil = 500*k;  //为倒数第一个加油点以及每个加油点的储油量}while(dis<1000);printf("储油点%d:距离出发点%d,储油量%.2lf L\n",k,0,oil);// 由于总距离超过了1000km,需要重新计算第一个加油点到出发点的距离,从而得出开始点的实际的储油量dis=dis-500.00/(2*k-1); //减去最后一次汽车的距离,得出前n-1个加油点需要的总量// 计算总耗油量=前k-1个加油点需要的油量+第一个加油点到出发点的距离(即油量)oil = 500.00*(k-1)+(1000-dis)*(2*k-1);printf("\n计算实际需要出发点的储油量:\n");printf("储油点%d:距离出发点%d,储油量%.2lf L\n",k,0,oil);return 0;
}

运行结果:

汽车穿越沙漠的算法问题(反推法)相关推荐

  1. 穿越沙漠问题(C++倒推法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 穿越沙漠问题. 用一辆吉普车穿越1000km的沙漠.吉普车的总装油量为500usgal,耗油率为1加仑/km.由于沙漠中没有油 ...

  2. 汽车穿越沙漠的算法问题【python】

    一辆吉普车来到1000km宽的沙漠边沿.吉普车的耗油量为1L/km,总装油量为500L.显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的.假设在沙漠边沿有充足的汽油可供使 ...

  3. 程序设计典型算法之递推法

    程序设计典型算法之递推法 一时兴起,刚吃完晚饭,突然又想写点东西,可能太久没有写东西了吧! 问题:小猴吃桃问题.小猴在一天内摘了若干桃子,当天吃掉一半多一个:第二天吃掉剩下的一半桃子多一个:以后每天都 ...

  4. 从YouTube算法论文反推其推荐机制

    去年,在波士顿举办的第10届ACM推荐系统大会(ACM's RecSys '16)上,来自Google的一个研究团队公布了YouTube推荐系统的深度学习论文:Deep Neural Networks ...

  5. 递推算法5——逆推法之猴子摘桃问题

    逆推法是根据结果推出已知条件,推算方法与顺推法类似,只是需要将结果作为初始条件向前推算.比较典型的例子是猴子摘桃和存取问题 猴子摘桃 [问题描述] 猴子第一天摘了若干个桃子,当即吃了一半,还不过瘾,又 ...

  6. 递推算法6——逆推法之存取问题

    该存多少钱 小明打算为自己的三年研究生生活准备了一笔学费,一次性的存入银行,保证每年年底取出1000元,到第3年学习结束时刚刚好取完.假设银行一年整存零取得月息为0.31%,请问需存入银行多少钱? [ ...

  7. 程序算法之逆推法(口算猴子摘桃问题正解、详解)

    偶然间看到有篇猴子摘桃问题的博文,问题蛮有趣的,只是他的答案令人不敢恭维.....问题如下: 有一只猴子,摘了很多桃子,他每天吃掉一些,剩下的桃子比之前的全部的一半少一个.他吃了十天才吃完,请问他一共 ...

  8. 【百科】前端/後端、前台/後台的英文選擇(反推法)

    有些人問前端/後端.前台/後台要用什麼英文? 查了一下網友給出了以下幾種回答: 1. client side.server side 2. front side.back side 3. front ...

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

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

最新文章

  1. 课程升级 | 极速构建知识体系,即学即用 Serverless
  2. Python中Pyaudio安装失败的解决办法
  3. 用PowerDesigner工具条不见的
  4. python画图猪_用Python的turtle画一只小猪乔治【刚学python两天,记念一下】
  5. css图片自适应 有缝隙,有间隙,解决办法
  6. 常见的6种线程池及简单使用
  7. 数据库-MySQL-搭建服务器
  8. 【hbase】HBASE的安装与配置的步骤详解
  9. ES6学习(三)—字符串的扩展
  10. 程序员的十个经典算法
  11. Matlab实现无标度网络生成及其分析
  12. 华为三层交换机配置方法实例
  13. 微信SDK删除支付模块流程
  14. js相对视口的高度_js获取可视区域高度
  15. Linux文件内容查阅 - cat, tac, nl, more, less, head, tail, od
  16. rsync使用ssh指定端口
  17. http://www.ithao123.cn/content-1432166.html
  18. StoneDB 团队成员与 MySQL 之父 Monty 会面,共话未来数据库形态
  19. esp8266 rtos 开发环境 ubuntu_树莓派安装ESP8266_SDK开发环境
  20. WorkFlow .Net 流程介绍

热门文章

  1. boost::hana::any用法的测试程序
  2. boost::graph::isomorphism用法的测试程序
  3. Boost:最小最大计时器测试程序
  4. ITK:切割网格CutMesh
  5. DCMTK:OFpath和相关内容的测试程序
  6. VTK:可视化算法之FilledContours
  7. VTK:可视化之ColorActorEdges
  8. VTK:几何对象之EllipticalCylinderDemo
  9. OpenCV高级形态转换的实例(附完整代码)
  10. OpenCV使用Laplacian filtering和距离变换以及Laplacian滤波对重叠对象进行分段的实例(附完整代码)