首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。