zoj 2972 Hurdles of 110 m(dp、バックパック)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2972
タイトルは、t 1(最速で必要な時間)、t 2(normal)、t 3(slowest)、およびt 1に必要なエネルギー、t 3によって得られたエネルギー、t 2は消費しなくても勝ちません.
最小消費時間を求める.
int dp[x][y]///xのハードルを越えてy体力を残すには最小時間が必要です.
タイトルは、t 1(最速で必要な時間)、t 2(normal)、t 3(slowest)、およびt 1に必要なエネルギー、t 3によって得られたエネルギー、t 2は消費しなくても勝ちません.
最小消費時間を求める.
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
",minTime);
}
// system("pause");
return 0;
}