多重背包SDNUOJ 1520

Description
SQK上山去采药。SQK有一个容量为m(1<=m<=1000)的背包,他所采集的药材的总重量不能大于背包的容量。已知共有n(1<=n<=100 )种药材,每种药材都有自己的价值,并且知道每种药材的数量是有限的,如何选择,才能使得背包中药材价值最大?

Input
输入数据首先包含一个正整数C(1<=C<=10),表示有C组测试用例,每组测试用例的第一行是两个整数m和n(1<=m<=1000, 1<=n<=100),分别表背包的负重和药材的种类,然后是n行数据,每行包含3个数w,v和c(1<=w<=100,1<=v<=200,1<=c<=100),分别表示每种药材的重量、每株的价值以及对应种类药材的株数。

Output
对于每组测试数据,请输出能够采集药材的最大价值,每个实例的输出占一行。

Sample Input
1
8 2
2 100 4
4 100 2
Sample Output
400

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 1005
///单价, 重量, 袋数
int p[N], w[N], num[N];
///该经费对应的最大重量
int m[N];

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int c, n;
        cin >> c >> n;
        for(int i = 1; i <= n; i++)
            cin >> p[i] >> w[i] >> num[i];
        memset(m, 0, sizeof(m));
        ///对第i个物品的检测
        for(int i = 1; i <= n; i++)
        {
            ///对第i个物品检测次数 = 其现有数目(相当于0-1背包多了几个种类)
            for(int k = 0; k < num[i]; k++)
            {
                ///在0-1背包基础上的改动,因此为逆序枚举
                for(int j = c; j >= p[i]; j--)
                    m[j] = max(m[j],m[j-p[i]] + w[i]);
            }
        }
        cout << m[c] << '\n' ;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhaobaole2018/article/details/84842916