首页 > 代码库 > UVA 10201 DP

UVA 10201 DP

Adventures in Moving - Part IV

题意:

汽车邮箱容量200升,最初有100升油,要求到达终点油箱中的油不少于100升的最小花费,不能到达终点输出Impossible.

汽车走1单位距离消耗1升油。

输入t组数据

输入n表示要求从起点到距离为n的点

输入若干个加油站的a,b,表示加油站距离起点的距离和每升油的价格;

代码:

//dp[i][j]=min(dp[i][j],dp[i-1][j+dis-k]+k*w),dp[i][j]表示到达//i加油站时还剩j升油,dis表示i到i-1的距离,k(0<=k<=j)表示在i//加油站买多少油,最后要求dp[m][100+n-id[m]]!=inf.#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int inf=0x3f3f3f3f;int dp[110][210],id[110],w[110];char s[110];int main(){    int t,n;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        getchar();        memset(dp,inf,sizeof(dp));        dp[0][100]=0;        int cnt=0;        while(gets(s)!=NULL&&s[0]!=\0){            cnt++;            sscanf(s,"%d %d",&id[cnt],&w[cnt]);            if(id[cnt]>n) cnt--;        }        id[0]=0;        for(int i=1;i<=cnt;i++){            int dis=id[i]-id[i-1];            for(int j=0;j<=200;j++){                for(int k=0;k<=j;k++)                    if(j+dis-k<=200)                    dp[i][j]=min(dp[i][j],dp[i-1][j+dis-k]+k*w[i]);            }        }        if(n-id[cnt]>100||dp[cnt][100+n-id[cnt]]==inf) printf("Impossible\n");        else printf("%d\n",dp[cnt][100+n-id[cnt]]);        if(t) printf("\n");    }    return 0;}/*1500100 999150 888200 777300 999400 1009450 1019500 1399 */

 

UVA 10201 DP