ZOJ 2972(背包dp)

来源:互联网 发布:mesh网络 编辑:程序博客网 时间:2024/05/16 14:51

 
 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;}


0 0