一、问题描述

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

二、问题分析

本题是一个极值问题,要求具有最小的油耗。因此,它的解是唯一的。吉普车在沙漠中建临时油库,是逐步向前推进的,即建好一个油库后,再建下一个油库。为使油耗最小应做到:

(1)每次吉普车出发时都应满载,放下一部分油再返回时,油恰好用完,并且把下一    个油库建好后这个油库中的油恰好用完。所以每个点的油库中的油都应是吉普车装油量的整数倍(因为出发时满载),即500Xk(k为正整数),并且每个点的 存油量为下一个点的存油量及吉普车为建立下个油库在两点之间往返的油耗之和 (下一个油库建成,前一个油库中的油恰好用完)。

(2)吉普车为建立下一个油库运油次数应最少。

用递推法解这个题,可由一个点的存油量推出相邻的另一个点的存油量及两点之    间的距离。但正推是不可能的,因为第一个点的存油量及其距A的距离尚无法确定。但是可推得最后一个点Cl的存油量应为500L,它与B相距为500km, 这样吉普车从Cl到达B恰好跑一趟B。递推必须由已知的初始条件开始。为此本题应使用倒推法。A为起始点,B为终 点, C1,…,Cn分别为倒数第1,2,…,n个临时油库点。

由于B点无需储油,吉普车只须从Cl到达B即可,所以C1点的存油量应为500L,C1到B的距离为500km。为向C1送500L油,吉普车最少 要满载出发两次(若一趟,因途中要耗油而不可能),往返共三程(应为奇数)。考虑最少油耗,C2点应存油2*500L。由此可得如下关系:

v2=3*x2+500=2*500

x2=500/3

C2:距B的路程为:

d2=d1+x2=500+500/3=(1+1/3)*500

为向C2:送1000L油,吉普车最少要满载出发3次,往返共5趟。考虑最少油耗,C3,点应存油3*500L。由此可得:

v3=5*x3+v2=3*500

x3=500/5

d3=d2+x3=(1+1/3+1/5)*500

同理可知,对倒数第i个点有:

Vi=(2*i-1)Xi+Vi-1=i*500    —

Xi=500/(2*i—1)    :

Di=di-1+xi=(1+1/3+1/5+…1/(2*i-1))*500

递推到di≥1000时结束。当di≥1000时,Ci-1就是倒数最后一个油库点。它距A的距离为1000—di-l。

相关代码:

//************************************ // Method: 穿越沙漠问题,最小油耗解法.临时补给站不留油 // Parameter: double dDis,沙漠宽度,两端距离 // Parameter: double speed,单位距离的油耗速度 // Parameter: double oilPer,单次的最大负载 // Returns: void //************************************ void Travel_Answer(double dDis, double speed, double oilPer) { // 满负载可行距离 double disPer = oilPer/speed; if(dDis <= disPer) { printf("总距离小于单次满负载可行距离,直接通过即可/n"); return; } // 否则需要设置临时补给站,每个临时补给站的储油量应该是单次最大负载的整数倍 double d = disPer; int i = 1; while(d < dDis) { // 计算下一个补给站 ++i; d += 1.0/(2*i-1)*disPer; } printf("起点需设储油量:%g/n", oilPer*i); double totalOil = -1; while(i>1) { d -= disPer/(2*i-1); --i; if(totalOil < 0) { totalOil = oilPer*i + (dDis-d)*(2*i+1)/speed; } printf("下一个补给点为距起点%g处,储油量:%g/n", dDis - d, oilPer*i); } printf("总耗油量:%g", totalOil); }

输出结果:

起点需设储油量:4000 下一个补给点为距起点22.4331处,储油量:3500 下一个补给点为距起点60.8947处,储油量:3000 下一个补给点为距起点106.349处,储油量:2500 下一个补给点为距起点161.905处,储油量:2000 下一个补给点为距起点233.333处,储油量:1500 下一个补给点为距起点333.333处,储油量:1000 下一个补给点为距起点500处,储油量:500 总耗油量:3836.5

相关问题1:

飞机加油问题:

每个飞机只有一个油箱,
飞机之间可以相互加油(注意是相互,没有加油机)
一箱油可供一架飞机绕地球飞半圈,
问题:
为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)

3 架解法(地球是圆的):

首先AB两架飞机同时满油起飞,油耗1/3,即飞行1/6的距离点1时,把B中1/3的油加到A中,B返回,此时A满油,如不加油可飞1/2的距离点2,总共飞1/6+1/2=2/3的距离,此时距离原点还有1/3距离,故可在飞机A距离点2还有1/3的距离时,从机场起飞满油飞机C迎向A,可在A空油时正好在点2相遇,C给A加1/3油,C返回即可。当C起飞时,A从点1飞行了1/2-1/3 = 1/6的距离,此时B尚未返回。

问题变形:

一个商人骑一头驴要穿越1000公里长的沙漠,去卖3000根胡萝卜。已知驴一次性可驮1000根胡萝卜,但每走1公里又要吃掉1根胡萝卜。问:商人最多可卖出多少胡萝卜?

同样的道理:为使利益最大,需要建立临时补给站。且临时补给站的存货应该是驴最大负重的整数倍。此题与第一题的不同之处在于在最小消耗下运送最大的量。

设沙漠两端AB,最后的补给站为C1,则C1 = 1000,距离B点还有x公里,d1 = x>=0.目标x最小。

C2点:

C2 = 1000*2,

d2 = d1+x2 = d1+1000/3 = x+1000/3;

C3点:

C3 = 1000*3

d3 = d2+x3 = x + (1/3+1/5)*1000

di = x+(1/3+1/5+...+1/(2*i-1))*1000

Ci = 1000*i

商人要卖出最多的胡萝卜就要使Cn = 初始总量W。即把起点也看作一个临时补给站。

商人做多可卖出的胡萝卜y = 1000-x = (1/3+1/5)*1000 = 533

算法题15 穿越沙漠问题,飞机加油问题相关推荐

  1. 2020年数学建模国赛B题:穿越沙漠

    B题 穿越沙漠 考虑如下的小游戏:玩家凭借一张地图,利用初始资金购买一定数量的水和食物(包括食品和其他日常用品),从起点出发,在沙漠中行走.途中会遇到不同的天气,也可在矿山.村庄补充资金或资源,目标是 ...

  2. 2020年全国大学生数学建模竞赛B题穿越沙漠问题——建立整数线性规划模型(ILP)——通过LINGO求解

    2020年全国大学生数学建模竞赛B题 穿越沙漠 题目是讲玩家在不同地图下穿越沙漠,所获得的资金数要最多(大概是这个意思).然后通过文章的描述又总结了N个约束条件.整体的思路就是对资金最大化作为目标函数 ...

  3. 2020数学建模国赛B题穿越沙漠个人解析

    前言 博主发这篇文章的时候国赛早就结束了,仅仅是出于给自己留个纪念以及交流讨论的目的写的博客.所以如果你对我不在比赛那几天发的行为感到不满,请直接退出就好,我也没觉得自己的想法多么优秀,能够断言自己是 ...

  4. 2020年数学建模国赛B题“穿越沙漠”思路

    目录 原题 关键词 目标 问题一分析 问题二分析 问题三分析 比赛后的一些些感想 原题 考虑如下的小游戏:玩家凭借一张地图,利用初始资金购买一定数量的水和食物(包括食品和其他日常用品),从起点出发,在 ...

  5. 【算法设计zxd】第3章 迭代法 杨辉三角,穿越沙漠,内存移动,竖式相乘(阶乘)

    目录 迭代:(辗转法)        一种 不断用变量的旧值递推新值的过程 [例3-1] 输出如图的杨辉三角形. [例3-2]穿越沙漠问题 [例3-2]内存移动问题 [例3-4]编程求当n<=1 ...

  6. 15道使用频率极高的基础算法题

    算法题列表 1.合并排序,将两个已经排序的数组合并成一个数组,其中一个数组能容下两个数组的所有元素; 2.合并两个已经排序的单链表; 3.倒序打印一个单链表; 4.给定一个单链表的头指针和一个指定节点 ...

  7. 学习笔记之15道简单算法题

    15道简单算法题 http://www.cnblogs.com/hlxs/archive/2014/06/06/3772333.html (●-●) | 剑指Offer_编程题_牛客网 http:// ...

  8. 2020年高教社建模国赛真题B题--穿越沙漠

    2020年高教社杯全国大学生数学建模竞赛题目 (请先阅读"全国大学生数学建模竞赛论文格式规范") B题   穿越沙漠 考虑如下的小游戏:玩家凭借一张地图,利用初始资金购买一定数量的 ...

  9. 算法 穿越沙漠问题(递推法)

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

  10. 算法设计与分析-迭代法-穿越沙漠问题

    算法设计与分析-迭代法-穿越沙漠问题 题目: 用一辆吉普车穿越1000公里的沙漠.吉普车的总装油量为500升,耗油率为1升/公里.由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库.该吉普车以最少 ...

最新文章

  1. jQuery应用之(二)使用jQuery管理选择结果(荐)
  2. ASP.NET小技巧——回传后保持页面的滚动位置
  3. Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...
  4. java http zip参数,如何从Web API 2 HttpGet发送zip文件
  5. oppoJava面试!java开发视频聊天
  6. HTML配置CSDN自定义栏目
  7. list scala 当前位置 遍历_Scala学习七之集合了解
  8. Ios 12 linux,iOS12.3~12.4.2支持越狱?包括 A12 设备
  9. vue将文件/图片/视频批量打包成压缩包,并进行下载
  10. 梅特勒托利多xk3124电子秤说明书_梅特勒托利多称重仪表XK3124 B520
  11. springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录)
  12. 超百万观众同场看直播流畅不卡顿,快手如何做到的?|首次披露
  13. 自动表单生成工具说明(后端、桌面、web、移动端)
  14. 全国青少年编程等级考试python一级真题2022年3月(含题库答题软件账号)
  15. windows企微应用双开/多开
  16. 四川多多开店:拼多多商家绑定银行卡怎么绑定
  17. 用于图像识别的神经网络,以及5大应用场景
  18. 知识变现海哥|知识变现五大赛道,你选哪一道?
  19. 常见支持linux平台的应用软件
  20. 浅析快消品企业营销费用管理之道

热门文章

  1. 基于MATLAB实现四阶龙格库塔法求解一、二阶微分方程实例
  2. 记一次调研DS证据理论中遇到的问题
  3. 非常好的截图软件:FSCapture,非常非常非常推荐(百度云链接)
  4. 如何利用window下的Dos命令实现将多个txt合并成一个txt
  5. linux系统每次开机分辨率,解决linux分辨率设置过高 不能进入图形界面
  6. 多元统计分析 (一):聚类分析
  7. 微型计算机控制技术学科认识,微型计算机控制技术学习心得.docx
  8. 计算机图形学基础第七章ppt,第三章 计算机图形学基础ppt课件.ppt
  9. 野火stm32资源下载(视频,手册等)
  10. 超市管理系统连接服务器失败,超市管理系统应用解决超市管理难题