首先可以将多重背包的每一种物品的数量都看做一种物品,这样就转化成了01背包。但是由于数据过大会超时。
所以在这里采用二进制的优化,可以使用二进制将其某种物品的数量捆绑成1,2,4,8.。。。。。。这样可以将表示的数量缩短。
然后采用01背包的做法即可。
#include <bits/stdc++.h>


using namespace std;

struct Node{
    int weight;
    int value;
} node[2000+10];
int dp[2000+10];

int main() {
    int n, t;
    int x, w, v, cnt = 1;
    cin>>n>>t;
    for (int i=1;i<=n;i++) {
        cin>>x>>w>>v;
        int k = 1;
        while ((k<<1)+1<=x) {
            k = (k<<1)+1;
        }
        int num = 1, temp = k;
        while (k) {
            node[cnt].weight = w*num;
            node[cnt].value = v*num;
            num = num*2;
            cnt++;k = (k>>1);
        }
        if (x>temp) {
            node[cnt].weight = w*(x-temp);
            node[cnt].value = v*(x-temp);
            cnt++;
        }
    }
    for (int i=1;i<=cnt;i++) {
        for (int j=t;j>=node[i].weight;j--) {
            dp[j] = max(dp[j], dp[j-node[i].weight]+node[i].value);
        }
    }
    cout<<dp[t];
    return 0;
}