1. 程式人生 > 其它 >AcWing 7. 混合揹包問題

AcWing 7. 混合揹包問題

#include <bits/stdc++.h>

using namespace std;
const int N = 100010;
int n;      //物品種類
int m;      //揹包容量
int v[N];   //物品體積
int w[N];   //物品價值
int f[N];   //dp陣列

int main() {
    cin >> n >> m;
    int cnt = 1;
    //n類物品
    for (int i = 1; i <= n; i++) {
        int a, b, s;
        //體積,價值,個數
        cin >> a >> b >> s;
        if (s < 0)s = 1;            //題目中s=-1表示只有1個
        else if (s == 0)s = m / a;  //完全揹包:最多總體積/該物品體積向下取整
        //將01揹包和完全揹包利用二進位制優化轉化為多重揹包
        int k = 1;
        while (k <= s) {
            v[cnt] = a * k;
            w[cnt] = b * k;
            s -= k;
            k *= 2;
            cnt++;
        }
        if (s > 0) {
            v[cnt] = s * a;
            w[cnt] = s * b;
            cnt++;
        }
    }
    //01揹包模板
    for (int i = 1; i <= cnt; i++)
        for (int j = m; j >= v[i]; j--)
            f[j] = max(f[j], f[j - v[i]] + w[i]);
    //輸出大吉
    printf("%d", f[m]);
    return 0;
}