HDU 3033 I love sneakers!

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3033

经典,分组背包,第一次做这类题,其实就是多加一重循环用于分组DP。

#include <iostream>
using namespace std;
int dp[15][10100];
int brand[110],cost[110],val[110];
int main(int argc, const char *argv[])
{
    int N,M,K;
    //freopen("input.txt","r",stdin);
    while(cin>>N>>M>>K)
    {
        for(int i=1;i<=N;i++)
        {
            cin>>brand[i]>>cost[i]>>val[i];
        }
        memset(dp,-1,sizeof(dp));
        for(int j=0;j<=M;j++) dp[0][j]=0;
        for(int i=1;i<=K;i++)
        {
            for(int j=1;j<=N;j++)
            {
                if(brand[j]==i)
                {
                    for(int k=M;k>=cost[j];k--)
                    {
                        dp[i][k]=max(max(dp[i][k],dp[i-1][k-cost[j]]+val[j]),dp[i][k-cost[j]]+val[j]);
                    }
                }
            }
        }
        if(dp[K][M]<0)
            cout<<"Impossible"<<endl;
        else cout<<dp[K][M]<<endl;
    }

    return 0;
}

 

posted @ 2013-09-21 21:45  Destino74  阅读(156)  评论(0编辑  收藏  举报