POJ2465

本文介绍了一种使用动态规划解决车辆加油问题的方法。问题设定为:一辆初始油量为100L的车需从起点行驶至终点,途中经过多个加油站,各站油价不同,求最低花费。通过扩展终点并设其油价为0,利用二维数组记录状态,实现最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:有一辆车要从起点0,到终点L处,中间有若干个加油站.给出车的油箱容量200,每行驶1km耗油1L.给出加油站的坐标,以及每个加油站的油价.一开始油箱里有100L的油,到达终点时必须还有100L的油,求最少花多少钱在加油上.

分析:DP.对于到达终点时必须还有100L的油这个问题,只要将终点放远100米,设置为油价为0的加油站即可.

F[i,j]表示到达第i个加油站有油j升的最优值.到达一个加油站时,枚举加多少油就好了.

code:

var   f:array[0..110,0..210] of longint;
      g:array[0..110,0..210] of boolean;
      d,p:array[0..110] of longint;
      dis,n,i,j,k,c,ans:longint;

      function min(a,b:longint):longint;
      begin
            if a>b then exit(b); exit(a);
      end;


begin
      readln(dis);
      while not seekeof do
      begin
            inc(n);
            readln(d[n],p[n]);
            if d[n]>dis then break;
      end;
      if d[n]>dis then dec(n);
      inc(n);
      d[n]:=dis+100;
      p[n]:=0;

      f[0,100]:=0;
      g[0,100]:=true;
      for i:=0 to n-1 do
         for j:=0 to 200 do
         if g[i,j] then
         begin
               c:=j-(d[i+1]-d[i]);
               if c>=0 then
               begin
                     for k:=0 to 200 do
                        if k+c<=200 then
                          if not g[i+1,k+c] then
                          begin
                                f[i+1,k+c]:=f[i,j]+k*p[i+1];
                                g[i+1,k+c]:=true;
                          end
                          else f[i+1,k+c]:=min(f[i+1,k+c],f[i,j]+k*p[i+1])
                        else break;
               end;
         end;
      ans:=maxlongint;
      for i:=0 to 200 do
         if g[n,i] then ans:=min(ans,f[n,i]);

      if ans=maxlongint then writeln('Impossible')
      else writeln(ans);
end.

转载于:https://www.cnblogs.com/exponent/archive/2011/08/13/2137089.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值