HDOJ 5543 Pick The Sticks (简单DP)

来源:互联网 发布:朱婷 大冠军杯 知乎 编辑:程序博客网 时间:2024/05/16 06:43

you can find this problem in this link
the dynamic programming equation is:
dp[j][k]=max(dp[j][k],dp[jlen[i]][k]+val[i]) j means the length of current ans ,k means the position of the current stick :in left border ,right border and in the middle of the table.So we have to double the length of each sitcks and the length of table.To be honest , it’s just a sample 01 bags problem.

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define ll long longusing namespace std;const int maxn = 50000;ll dp[maxn][3];int len[maxn];int val[maxn];int n,L;int main(){    int ca,cat = 1;    cin>>ca;    while(ca--)    {        ll ans = 0;        cin>>n>>L;        L*=2;        for(int i=0;i<n;i++)        {            cin>>len[i]>>val[i];            len[i]*=2;            ans = max(ans,(ll)val[i]);        }        memset(dp,0,sizeof(dp));        for(int i=0;i<n;i++)        {            for(int j = L;j>=len[i]/2;j--)            {                for(int k = 0;k<3;k++)                {                    if(j >= len[i])                    {                            dp[j][k] = max(dp[j][k],dp[j-len[i]][k] + val[i]);                    }                    if(k > 0)                    {                        dp[j][k] = max(dp[j][k],dp[j-len[i]/2][k-1]+val[i]);                    }                    ans = max(ans,dp[j][k]);                }            }        }        cout<<"Case #"<<cat++<<": "<<ans<<endl;//        for(int i = 0;i<=L;i++)//        {//            for(int j = 0;j<3;j++)//            {//                cout<<dp[i][j]<<" ";//            }//            cout<<endl;//        }//        cout<<endl;    }    return 0;}