#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const double ep=1e-10;
const int INF=0x3f3f3f3f;
int n, m;
struct node {
int t1, t2, t3, c1, c2;
} lan[120];
int dp[120][120];
int main() {
int T;
scanf("%d", &T);
while(T--) {
memset(dp, 0x3f, sizeof(dp));
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
scanf("%d%d%d%d%d", &lan[i].t1, &lan[i].t2, &lan[i].t3, &lan[i].c1, &lan[i].c2);
dp[0][m]=0;
for(int i=1; i<=n; i++) {
for(int j=0; j<=m; j++) {
if(m>=j+lan[i].c1)
dp[i][j]=min(dp[i][j], dp[i-1][j+lan[i].c1]+lan[i].t1);
dp[i][j]=min(dp[i][j], dp[i-1][j]+lan[i].t2);
/*if(j-lan[i].c2>=0)//很奇怪,不知道为什么用慢跑跟新的时候,被注释掉的部分这样写是不行的。
{
if(j==m)
{
for(int k=m-lan[i].c2; k<=m; k++)
dp[i][m]=min(dp[i][m], dp[i-1][k]+lan[i].t3);
}
else
dp[i][j]=min(dp[i][j], dp[i-1][j-lan[i].c2]+lan[i].t3);
}*/
int tmp=min(m, j+lan[i].c2);
dp[i][tmp]=min(dp[i][tmp], dp[i-1][j]+lan[i].t3);
}
}
int ans=INF;
for(int i=0; i<=m; i++)
ans=min(dp[n][i], ans);
printf("%d\n", ans);
}
return 0;
}
Hurdles of 110m ZOJ - 2972 (动态规划)
最新推荐文章于 2019-04-12 21:03:49 发布