百思不得其解:汽车过沙漠最省油的算法?有意思!

thindog 2003-03-04 05:32:35
问题的描述:

一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1公升每公里,卡车总载油能力为500公升。显然卡车装一次油是过不了沙漠的。因此司机必须设法在沿途建立几个储油点,使卡车能顺利穿越沙漠,试问司机如何建立这些储油点?每一储油点应存多少汽油,才能使卡车以消耗最少的汽油代价通过沙漠?

想要写一个函数:
参数是:两地的总里程,卡车的总油量,和耗油率
返回若干行的数据>>

1储油点,50公里,100公斤油
2储油点,100公里,100公斤油
... ...
l储油点,n公里,m公斤油

总计最少耗油为k公斤.

小弟感觉很有意思,正在努力考虑中,也想看看高手是怎么考虑的,呵呵.
明天再来看看^_^
祝大家愉快!
先答者给分!
...全文
1176 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
battlet 2003-03-06
  • 打赏
  • 举报
回复
问一下车的载油能力有限制嘛?
可以无限装载汽油否?
thindog 2003-03-06
  • 打赏
  • 举报
回复
有高手从数学的角度考虑过此问题吗?
wshcdr 2003-03-05
  • 打赏
  • 举报
回复
gz
thindog 2003-03-05
  • 打赏
  • 举报
回复
那位热心的高手给个详细的注释,给100分!

#include<iostream.h>
#include<iomanip.h>
void main()
{
int k;
float d,dl;
float oil[10],dis[10];
cout<<"No."<<setw(10)<<" distance(k.m)"<<setw(10)<<" oil(l.)"<<endl;
k=1;
d=500;
dis[1]=500;
oil[1]=500;
do{
k++;
d+=500/(2*k-1);
dis[k]=d;
oil[k]=oil[k-1]+500;
}while(d<1000);
dis[k]=1000;
dl=1000-dis[k-1];
oil[k]=dl*(2*k+1)+oil[k-1];
for(int i=0;i<k;i++)
cout<<i<<setw(10)<<(1000-dis[k-i])<<setw(15)<<oil[k-i]<<endl;
}
JoshuaLi 2003-03-05
  • 打赏
  • 举报
回复
学习
孩皮妞野 2003-03-05
  • 打赏
  • 举报
回复
一年前有个环球接力飞行的题跟这个差不多。
Tbird21 2003-03-05
  • 打赏
  • 举报
回复
我想问一下,如果我建立1000个加油站,就不只要1公升可以跑完全程了!:)
ninesong 2003-03-05
  • 打赏
  • 举报
回复
一辆吉普车来到1000km宽的沙漠边沿。吉普车的耗油量为1L/Km,总装油量为500L。显然,吉普车必须用自身油箱中设几个临时加油点,否则是通不过沙漠的。假设在沙漠边沿有充足的汽油可供使用,那末吉普车应在那些地方,建多大的临时加油点,才能以最少的油耗穿过这块沙漠?

这个题目是用倒推法,我也是只看了看算法而已.因为我刚刚开始学习C,2个月水平有限,呵呵,先卖弄了.

从终点到起点1K公里.
我门从终点开始考虑,
也就是把终点到起点是:
I0……I1……I2……In

首先我们考虑是从I1到I0需要的油是500公升,也就是我门在I1的位置存放500公升的汽油才能保证车子到终点。

我门把两个I之间的距离写为S[i],耗油量为V[i];
这样第一步我们知道了I0……I1之间
S1=500公里,V1=500公升。

下一步,从I1……I2之间,我们必须至少要从I2处向I1开两趟车子(单向)才能保证I1处的储存量500公升。
这样因为我们是从I2开向I1处,所以,来回加(双向)在一起应该至少是3趟才能保证I1处有500公升的汽油。
能保证3次往返最低的耗油量就是500公升,
那么我们来求出3次往返的500公升耗油量的距离就是:S2=500 / 3。
I0……I2的距离就是:S1+S2=500+500/3
而同时在I2处的储存油量为:V2=500公升+500公升=1000公升

继续向下考虑,从I2……I3之间,保证I2处有1000公升的汽油,我门必须要卡车最少从I3向I2开3趟(单趟),来回就是5趟。路上的耗油量是500公升,也就是我门在I3处存放1500公升汽油。
那么我们来回的距离是:S3=500/5。
I0……I3的距离是:S1+S2+S3=500+500/2+500/3。
同时I3的储存油量是:1500公升。

由此推断:
如果需要i处储存油,那么要i*500的储存量。
车子从i+1到I处(单向)的至少要i次。加上返回的次数一共是2*i—1次。
而这2*i—1次的最小耗油量是500公升。
那么Si的距离就是500/(2*i—1)。

最后i=n到开始地点的
距离是1000-sum(Sn) (i为1、2、……求他们的和,也就是前面的总路程。)
储存油:n*500。

车子至少要从起点开n+1次满油到n处。加上返回的,一共是2n+1次。

我们2n+1次的耗油量是(1000-sum(Sn))*(2n+1)
[注:就是距离*往返次数=500和前面的500/往返次数=距离是一样的。]
我们起点的油量Vn+(1000-sum(Sn))*(2n+1)。
Vn就是从n点到终点I0总的需求油量。


下面这个地方可以了解详细问题。
http://expert.csdn.net/Expert/topic/1001/1001713.xml?temp=.5861322
ann98 2003-03-05
  • 打赏
  • 举报
回复
你们有没有解过九连环?
thindog 2003-03-05
  • 打赏
  • 举报
回复
To myy:

整理后,得:250=X[1]/n+…………X[n]/n
等式的右边,可用化求和为积分的方法,求得你想要的值。

这个式子我也写出来了,可是具体的积分方法还没想出头绪:(

虽然在程序上解决了,但是,谁能用数学的方法证明一下,这样做才是最省油的呢?

积分?被积式怎么写?强烈渴望得到数学的证明!!嘿嘿!!好像比用程序来推理麻烦一些~~:)
myy 2003-03-05
  • 打赏
  • 举报
回复
A地距B地1000公里,一辆车一次最多只能装500升油,已知每公里耗油1升,车子可以在
途中把油放下等以后用,请问该车从A地到达B地最少需耗油多少升?

alan yao <Alan_Yao@163.net>:
第一次省油:500-2X[1]



第n次省油:500-2X[n]

最后:500n-2(X[1]+………+X[n])=0;

整理后,得:250=X[1]/n+…………X[n]/n
等式的右边,可用化求和为积分的方法,求得你想要的值。
用户 昵称 2003-03-05
  • 打赏
  • 举报
回复
interesting
thindog 2003-03-04
  • 打赏
  • 举报
回复
再问:用程序谢函数的话,用不用递归算法?
Goldbach 2003-03-04
  • 打赏
  • 举报
回复
接:
不过当时我看到的问题描述的比上面的要详细和清楚。
原来的题目是这样的: 汽车本身能储存一定的汽油,还有几个油桶
Goldbach 2003-03-04
  • 打赏
  • 举报
回复
Hi good evening everybody :
我曾经在高二得时候作过这道题, 还向天津师范主办的数学杂志--<<高等数学>>
投过稿 。他们给了我一个很好的答案。可惜那份答案已经遗失。
xueqt 2003-03-04
  • 打赏
  • 举报
回复
哈哈哈哈,我知道我错在哪里了!
不过第一个25公里不需要425吧
去8趟回7趟应是375呀,那应是3875乐,
Frank001说说?
thindog 2003-03-04
  • 打赏
  • 举报
回复
啊,答案出来了,不过嘛,我想看看具体的实现哟,嘿嘿.
找到了算法版,到那里贴贴~~~^0^
xueqt 2003-03-04
  • 打赏
  • 举报
回复
Frank001的是对的,我也是反着算的,怎么就搞错了
xueqt 2003-03-04
  • 打赏
  • 举报
回复
错了,是4500公升
xueqt 2003-03-04
  • 打赏
  • 举报
回复
需要4000公升
1,500/15公里
2,拒1:500/13公里
3,拒2:500/11公里
4,拒3:500/9公里
5:500/7
6:500/5=100
7:500/3
共7个储油点,我就用机器算了一个1/3+1/5+1/7+.....>1
加载更多回复(19)

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧