杭电ACM2191(多重背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
题目大意:中文题目。愿逝者安息,愿世界上多一些美好,少一些灾难。
解题思路:根据《背包九讲》的讲解,多重背包可以拆成每一个都是01背包。
AC代码:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    int c;
    int n,m;
    int cost[105],weight[105],count[105];
    int dp[4005];
    while(cin>>c)
    {
        while(c--)
        {
            memset(dp,0,sizeof(dp));
            cin>>n>>m;
            for(int i=0;i<m;i++)
            {
                cin>>cost[i]>>weight[i]>>count[i];
            }
            for(int i=0;i<m;i++)
            {
                for(int k=1;k<=count[i];k++)
                {
                    for(int j=n;j>=cost[i];j--)
                    {
                        if(dp[j-cost[i]]+weight[i]>dp[j])dp[j] = dp[j-cost[i]]+weight[i];
                    }
                }
            }
            cout<<dp[n]<<endl;
        }   
    }
    return 0;
}

你可能感兴趣的:(ACM,杭电)