POJ2465Adventures in Moving - Part IV题解动态规划DP

Adventures in Moving - Part IV
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 1969   Accepted: 668

Description

To help you move from Waterloo to the big city, you are considering renting a moving truck. Gas prices being so high these days, you want to know how much the gas for such a beast will set you back.
The truck consumes a full litre of gas for each kilometre it travels. It has a 200 litre gas tank. When you rent the truck in Waterloo, the tank is half full. When you return it in the big city, the tank must be at least half full, or you'll get gouged even more for gas by the rental company. You would like to spend as little as possible on gas, but you don't want to run out along the way.

Input

Input is all integers. The first integer is the distance in kilometres from Waterloo to the big city, at most 10000. Next comes a set of up to 100 gas station specifications, describing all the gas stations along your route, in non-decreasing order by distance. Each specification consists of the distance in kilometres of the gas station from Waterloo, and the price of a litre of gas at the gas station, in tenths of a cent, at most 2000.

Output

Output is the minimum amount of money that you can spend on gas to get you from Waterloo to the big city. If it is not possible to get from Waterloo to the big city without running out of gas along the way, output "Impossible".

Sample Input

500
100 999
150 888
200 777
300 999
400 1009
450 1019
500 1399

Sample Output

450550

Source

Waterloo local 2001.09.29
状态:
d[i][j]表示到达第i个站剩余j的汽油时最小花费
状态转移方程:

d[i+1][t]=min(d[i+1][t],d[i][j]+k*p[i])      (t=k+j-a[i+1]+a[i])>=0

 

 

边界:

 d[i][j]=INF

d[1][100-a[1]]=0

 

 

代码:

#include<cstdio> #define min(a,b) ((a)<(b)?(a):(b)) const int INF=-1u>>1; int main() { int i,j,k,n=1,m,t,ans=INF,a[105],p[105],d[105][205]; scanf("%d",&m); while(scanf("%d%d",a+n,p+n)==2) n++; a[n]=m;p[n]=INF; for(i=0;i<=n;i++) for(j=0;j<=200;j++) d[i][j]=INF; d[1][100-a[1]]=0; for(i=1;i<n;i++) for(j=0;j<=200;j++) if(d[i][j]^INF) for(k=0;k+j<=200;k++) if((t=k+j-a[i+1]+a[i])>=0) d[i+1][t]=min(d[i+1][t],d[i][j]+k*p[i]);//在第i站加k的油 for(i=100;i<=200;i++) ans=min(ans,d[n][i]); if(ans!=INF) printf("%d/n",ans); else puts("Impossible"); }

你可能感兴趣的:(POJ2465Adventures in Moving - Part IV题解动态规划DP)