J - Just Pour the Water
题目链接:ZOJ - 2974#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int dp[1100][1100], t[1000][3], w[1000][3];
int main(){
int T;
cin >> T;
while(T--){
int N, M;
cin >> N >> M;
for(int i=1; i<=N; i++){
cin >> t[i][0] >> t[i][1] >> t[i][2] >> w[i][0] >> w[i][2];
w[i][1]=0;
}
memset(dp, INF, sizeof(dp));
dp[0][M]=0;
for(int i=1; i<=N; i++){
for(int j=0; j<=M; j++){
//快跑:
if(j>=w[i][0]){
dp[i][j-w[i][0]]=min(dp[i][j-w[i][0]], dp[i-1][j]+t[i][0]);
}
//匀速跑:
dp[i][j]=min(dp[i][j], dp[i-1][j]+t[i][1]);
// 慢跑:
if(j+w[i][2]<=M) dp[i][j+w[i][2]]=min(dp[i][j+w[i][2]], dp[i-1][j]+t[i][2]);
else dp[i][M]=min(dp[i][M], dp[i-1][j]+t[i][2]);
}
}
int ans=INF;
for(int i=M; i>=0; i--)
ans=min(ans, dp[N][i]);
cout << ans << endl;
}
return 0;
}