http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2972
题目是给出t1(最快需要的时间),t2(normal),t3(slowest),以及t1所需要的能量,t3所赢得的能量,、t2不消耗也不赢得。
求最小消耗时间。
int dp[x][y];//跨越x个栏剩余y体力的需要的最小时间。
#include<stdio.h>//zoj 2972 dp zisu123
#include<string.h>
#include<stdlib.h>
#define INF 1<<25
typedef struct lx{
int t1,t2,t3;
int f1,f2;
}lx;
lx liu[120];
inline int min(int x,int y)
{
return x<y?x:y;
}
int main()
{
int T,N,M;
int dp[120][120];//跨越x个栏剩余y体力的需要的最小时间。
int i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
for(i=0;i<=N;i++)
for(j=0;j<=M;j++)
dp[i][j]=INF;
dp[0][M]=0;
for(i=0;i<N;i++)
scanf("%d%d%d%d%d",&liu[i].t1,&liu[i].t2,&liu[i].t3,&liu[i].f1,&liu[i].f2);
for(i=0;i<N;i++)
for(j=0;j<=M;j++)
{
if(j>=liu[i].f1)// fastest
{
dp[i+1][j-liu[i].f1]=min(dp[i+1][j-liu[i].f1],dp[i][j]+liu[i].t1);
}
if(j+liu[i].f2>M)//slowest
{
dp[i+1][M]=min(dp[i+1][M],dp[i][j]+liu[i].t3);
}
else
{
dp[i+1][j+liu[i].f2]=min(dp[i+1][j+liu[i].f2],dp[i][j]+liu[i].t3);
}
dp[i+1][j]=min(dp[i+1][j],dp[i][j]+liu[i].t2);//normal
}
int minTime=INF;
for(i=0;i<=M;i++)
{
if(minTime>dp[N][i])
minTime=dp[N][i];
}
printf("%d\n",minTime);
}
// system("pause");
return 0;
}