题意:有一辆车要从起点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.