dp[ i ][ j ]表示处于第i个栏,体力为j时所消耗的时间。
有了这个,后面的注意一下细节就好做了。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int INF=1e9;
int dp[120][120];
int t1[120],t2[120],t3[120],f1[120],f3[120];
int main()
{
int n,T,i,j,m;
cin>>T;
while(T--)
{
cin>>n>>m;
for(i=1; i<=n; i++)
{
cin>>t1[i]>>t2[i]>>t3[i]>>f1[i]>>f3[i];
}
memset(dp,-1,sizeof(dp));
dp[0][m]=0;
for(i=1; i<=n; i++)
{
for(j=0; j<=m; j++)
if(dp[i-1][j]!=-1)
{
if(j>=f1[i])
{
if(dp[i][j-f1[i]]==-1) dp[i][j-f1[i]]=dp[i-1][j]+t1[i];
else dp[i][j-f1[i]]=min(dp[i][j-f1[i]],dp[i-1][j]+t1[i]);
}
if(dp[i][j]==-1) dp[i][j]=dp[i-1][j]+t2[i];
else dp[i][j]=min(dp[i][j],dp[i-1][j]+t2[i]);
if(dp[i][min(m,j+f3[i])]==-1) dp[i][min(m,j+f3[i])]=dp[i-1][j]+t3[i];
else dp[i][min(m,j+f3[i])]=min(dp[i-1][j]+t3[i],dp[i][min(m,j+f3[i])]);
}
}
int _min=INF;
for(i=0; i<=m; i++)
if(dp[n][i]!=-1)
{
_min=min(_min,dp[n][i]);
}
cout<<_min<<endl;
}
return 0;
}