/*******************************************************************************
文件名: 穿越沙漠问题
创建人: 陈泽丹
创建时间: 2006年12月29日
版本号: 2.0
*******************************************************************************/
/*-----------------------------------------------------------------------------
问题描述:
一辆吉普车穿越1000千米的沙漠. 吉普车的总装油量为500加仑, 耗油率为1加仑/千米.
由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库. 若吉普车用最少的耗油量穿
越沙漠, 应在那些地方建立油库? 各处存储的油量是多少?
解题思路:
倒推法. 离终点处500千米必有加油点且车和站的油量总和为500加仑.
终点算起,每两个加油点间车子必走奇数次,且后面的加油点必存储了相邻的前一个加油
点的油量和车子要花的路耗.设前一个加油点储量为S, 车子来回一圈的圈数为k,路耗占能带
量的1/n, 车子满载量为C, 则:
C*(k*(n-2)/n+(n-1)/n) >= S
临界情况下 n = (2*k+1)/(k+1-S/C)
设C1 = 1-S/C, 则 n = (2*k+1)/(k+C1)
由于k必为自然数, 故枚举k, 当解n>0时, (k,n)为S的解.
又因为浪费主要在于车子运油时的路耗, 设其为S1,则
S1 = C*k*2/n = 2*C*(k*k+C1*k)/(2*k+1)
S1' = 2*C*(2*k*k+2*k+C1)/(2*k+1)*(2*k+1)
因为 n>0, 即 (2*k+1)/(k+C1)>0
又因为 k>0, 所以2*k+1>0, 所以k+C1>0, 所以C1>-k
所以 S1' = 2*C*(2*k*k+2*k+C1)/(2*k+1)*(2*k+1)
> 2*C*(2*k*k+2*k-k)/(2*k+1)*(2*k+1)
= 2*C*(2*k*k+k)/(2*k+1)*(2*k+1)
>= 0
所以S1在k的定义域内单调递增
所以min(k)为最优解.
然后回代, 使加油站的路段值累加大于计划路程时则题解.
------------------------------------------------------------------------------*/
#include
using namespace std;
double bring_max;
double oil_rate;
double plan;
bool Assistant_Number(int assistant_num, double &original_n, double oil)
{
double temp, n;
temp = (assistant_num+1.0-(oil/bring_max));
if (temp == 0) return false;
n = (1.0+2*assistant_num)/temp;
if (n>0)
{
original_n=n;
return true;
}
else return false;
}
double answer(double plan, bool f(int assistant_num, double &original_n, double oil))
{
if (!oil_rate) return 0;
double sum=0, aim_oil=0, n=0;
sum+=bring_max/oil_rate;
if (sum >= plan)
{
cout<<"从起点满载出发即可!"<= plan)
{
record[count][0] = 0;
record[count][1] = aim_oil;
break;
}
record[count][0] = plan-sum;
record[count++][1] = aim_oil;
}
cout<<"从起点算起: "<=0; i--)
cout<
穿越沙漠问题
最新推荐文章于 2025-08-13 01:23:48 发布
3573

被折叠的 条评论
为什么被折叠?



