穿越沙漠问题

/******************************************************************************* 文件名: 穿越沙漠问题 创建人:  陈泽丹 创建时间: 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< <<"千米处, 储油量"< <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值