分组背包

题目描述

有N件物品和一个容量为V的背包,将所有的物品划分成若干组,每个组里面的物品最多选一件。第i件物品的重量是w[i],价值是c[i],属于组k[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

输入描述

第一行为N(1N103)(1≤N≤10^3),V(1V103)(1≤V≤10^3)

下面N行,第i行描述第i个物品的w[i](1w[i]102)(1≤w[i]≤10^2),c[i](1c[i]106)(1≤c[i]≤10^6),k[i](1k[i]102)(1≤k[i]≤10^2),用一个空格分隔。

输出描述

输出只有一个数,最大总价值。

测试用例

输入

7 9
6 6 3
5 10 3
3 5 1
9 4 4
6 1 4
8 3 5
5 2 2

输出

15
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> vec[105];
int dp[1005], n, v, w, c, k, maxk = 0;

int main() {
    cin >> n >> v;
    for (int i = 1; i <= n; ++i)
        scanf(" %d%d%d", &w, &c, &k), maxk = max(maxk, k), vec[k].emplace_back(w, c);
    for (int i = 1; i <= maxk; ++i)
        for (int j = v; j >= 1; --j)
            for (auto& a : vec[i])
                if (j >= a.first)
                    dp[j] = max(dp[j], dp[j - a.first] + a.second);
    cout << dp[v];
}