zoj 2972 Hurdles of 110 m(dp、バックパック)

1758 ワード

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体力を残すには最小時間が必要です.
 
#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; }