算法 穿越沙漠问题(递推法)
问题描述
一辆吉普车来到1000km宽的沙漠边沿。吉普车的耗油量为1L/km,总装油量为500L。显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的。假设在沙漠边沿有充足的汽油可供使用,那么吉普车应在哪些地方、建多大的临的加油点,才能以最少的油耗穿过这块沙漠?
问题分析
储油点地址的确定比较复杂,从出发点考虑问题,很难确保按要求以最少的耗油量穿越沙漠,即很难保证到达终点时,沙漠中的各临时油库和车的储油量都恰好为0。所以我们从终点向起点应用逆推法。
过程:
为了做到耗油最少,那么每次吉普车出发时都应满载,放下一部分油再返回时,油恰好用完,并且把下一个油库建好后这个油库中的油恰好用完。所以每个点的油库中的油都应是吉普车装油量的整数倍(因为出发时满载),即500n(n为正整数),并且每个点的 存油量为下一个点的存油量及吉普车为建立下个油库在两点之间往返的油耗之和 (下一个油库建成,前一个油库中的油恰好用完)。
(1)由题可知,吉普车满载可以走500km。所以,第一段(即离终点最近的一段)长度为500km,并且,第一个加油点station_1(也是离终点最近的)的储油量为500L。
(2)那我们来看第二个加油点station_2。
它需要储存上一个加油点的储油量 + 车来往的耗油量。为了给station_1送500L油,车至少送两次油(因为中间路程要耗油嘛)。所以,车往返路程共3趟。
又考虑最少油耗,我们使这3趟路程耗油500L。那么station_2距station_1为500/3 = 167km,总共储油1000L。
(3)同样,我们看station_3。
为了给station_2送1000L油,至少送3次嘛,所以往返共5趟。
同样考虑耗油最少,那么station_3距station_2为 500/5 = 100km。
最后附上代码吧
/*
dis为储油点到终点的距离
*/#include <stdio.h>int main()
{int dis = 500, oil = 500;int k = 1;//因为不确定循环次数,又至少做一次,所以我们用do_whiledo{printf("储油点%d:距离出发点%5d,",k,1000-dis);printf("储油量%5dL\n",oil);k = k+1;dis = dis +500/(2*k-1);oil = 500*k;}while(dis<1000);// 再计算出发点的储油量oil = 500*(k-1)+(1000-dis)*(2*k-1);printf("储油点%d:距离出发点%5d,储油量%5dL\n",k,0,oil);return 0;
}
输出结果
算法 穿越沙漠问题(递推法)相关推荐
- 常见算法思想2:递推法
递推法 递推算法犹如稳重的有经验的老将,使用"稳扎稳打"的策略,不断利用已有的信息推导出新的东西. 在日常应用中有如下两种递推算法: (1)顺推法:从已知条件出发,逐步推算出要解决 ...
- 算法笔记方法论3 递推法与递归法
你站在桥上看风景看风景的人在楼上看你明月装饰了你的窗子你装饰了别人的梦--卞之琳 递推算法的特点 一个问题的求解需要大量重复计算,在已知的条件和所求问题之间总存在着某种相互联系的关系,在计算时,我们需 ...
- C/C++程序设计常用算法——递推法
文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善. 资料仅供学习交流使用. 作者:Aliven888 1.简述 ...
- 几个常见的简单的算法(暴力法,递推法,枚举法,递归法,分治法,贪心法,回溯法)
最近在学习算法相关知识. 通过买的视频教程了解到了一些简单的算法,为了加深感悟,同时也为了理解,将这几个常见的算法的定义进行记录. 算法是程序的灵魂,也可以认为是程序最重要的部分. 在通过算法解决问题 ...
- 程序设计典型算法之递推法
程序设计典型算法之递推法 一时兴起,刚吃完晚饭,突然又想写点东西,可能太久没有写东西了吧! 问题:小猴吃桃问题.小猴在一天内摘了若干桃子,当天吃掉一半多一个:第二天吃掉剩下的一半桃子多一个:以后每天都 ...
- 算法设计 之 递推法
2019独角兽企业重金招聘Python工程师标准>>> 递推法就是根据已知条件,分析推导出问题中的联系,然后一步一步进行推倒直至得到结果. 根据具体问题我们需要选择是正推还是逆推来解 ...
- 八大算法思想二——递推法
聪明一点的递推法 递推法:犹如稳重的老将,使用的就是"稳扎稳打"的策略,不断利用现有的信息推导出新的东西,在日常使用中有两种方法: 1,顺推法:从已知的条件出发,逐步推导得到解决问 ...
- 递推法 c语言,递推法
递推算法 给定一个数的序列H0,H1,-,Hn,-若存在整数n0,使当n>n0时,可以用等号(或大于号.小于号)将Hn与其前面的某些项Hi(0 递推算法是一种简单的算法,即通过已知条件,利用特定 ...
- 随机信号处理AR模型Yule_Walker方程直接解法和Levinson_Durbin递推法的MATLAB与Python实现
AR模型 AR模型的系统函数H(z)可以表示为: 我们的目的就是要求解系统函数的参数a和增益G. Yule_Walker方程 矩阵形式 根据生成的矩阵,可以解出p个参数 ,再根据自相关函数,可以求出系 ...
- 递推(一):递推法的基本思想
所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果.其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定. 利用递推算法求问题规模为n的解的基本思 ...
最新文章
- android相机截取矩形框,Android自定义照相机实现只拍摄矩形区域(重传)
- 汇编语言 第3版 王爽 检测点习题部分—答案及详细解析 检测点2.3
- Ubuntu18常用指令集合(更新中)
- Boost:bimap便利性标题的测试程序
- .NET系列 之 开源和不开源的背后
- REVERSE-PRACTICE-BUUCTF-4
- Jquery Mobile 画面导航栏共用的实现方法
- Photo Sphere Viewer 全景图
- 【报告分享】2020年小红书内容生态报告.pdf(附下载链接)
- CreateWaitableTimer和SetWaitableTimer
- 【Django 2021年最新版教程34】python unittest 对函数单元测试 覆盖率检测
- 数据挖掘课程设计实战——基于Django开发的音乐推荐系统网站
- 动易CMS从word复制粘贴公式
- 用window调用kjb和ktr
- 人人商城提示“app被您禁用啦,可以访问lbsyun.baidu.com/apiconsole/key#”
- 河北计算机软件职业技术学院,河北软件职业技术学院2021年排名
- 安全认证框架Shiro (二)- shiro过滤器工作原理
- 偏度与峰度(附python代码)
- linux中route命令的用法
- 解决打开vnc后键盘不能输入的问题