1. 程式人生 > 其它 >分組揹包

分組揹包

分組揹包模板

怎麼處理一組物品不重複放。其實很簡單,只需要把列舉組中物品的迴圈放到列舉揹包大小的迴圈下就行了。因為揹包dp需要揹包空間大小迴圈完一遍才能表示把一個物體放進去了。而在迴圈揹包空間的過程中列舉物品,就相當於只放一種物品。

#include<iostream>
#include<cstring>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
int v, n, t;
int x;
int g[205][205];
int i, j, k;
int w[10001], z[10001];
int b[10001];
int dp[10001];
int main() {
    //freopen("D:\\oj_sample\\tongtian\\5.in", "r", stdin);
    cin >> v >> n;
    for (i = 1; i <= n; i++) {
        cin >> w[i] >> z[i] >> x;
        t = max(t, x);
        b[x]++;
        g[x][b[x]] = i;   //對映
    }
    for (i = 1; i <= t; i++) {
        for (j = v; j >= 0; j--) {
            for (k = 1; k <= b[i]; k++) {
                if (j >= w[g[i][k]]) {
                    dp[j] = max(dp[j], dp[j - w[g[i][k]]] + z[g[i][k]]);
                }
            }
        }
    }
    cout << dp[v];
    return 0;
}