🎒 分组背包 · 动态演示 + 核心代码

▶ 📖 问题描述 & 算法原理

分组背包问题:给定 N 组物品,背包容量为 C。每组内有若干物品,每个物品有重量 w 和价值 v。每组最多选择 一个 物品(也可不选)。求在不超过背包容量的前提下,能获得的最大总价值。

输入格式:
第一行:N C
接下来 N 组:
每组第一行:m(该组物品数)
接下来 m 行:w v
示例输入:
3 7
2
2 3
3 4
2
4 8
5 10
2
1 2
2 5
示例输出: 15

📌 算法原理

状态定义: dp[i][j] 表示考虑前 i 组,背包容量为 j 时能获得的最大价值。

转移方程:
dp[i][j] = max( dp[i-1][j], max_{k∈组i} ( dp[i-1][j - w_{i,k}] + v_{i,k} ) )
即:不选第 i 组任何物品,或选该组内某个物品 k。

⚠️ 为什么枚举顺序是“组 → 容量 → 组内物品”?
• 组在外层:保证每组最多选一个,因为 dp[i][j] 只依赖 dp[i-1][...],不会同组内多个物品叠加。
• 容量在中间:容量是背包的限制维度,需要遍历所有可能容量,以便后续组继承。
• 组内物品在最内层:在固定组和容量的前提下,枚举该组所有物品,取最大值,实现“组内最多选一个”的约束。

这种顺序确保了动态规划的无后效性和最优子结构。

📦 物品分组 (每组最多选一件)

💡 点击物品的 重量 或 价值 可编辑
📝 当前步骤 0 / 0
点击「下一步」开始演示

📊 DP 状态表

⬜ 未计算  |  🟦 已计算  |  🔵 当前格子  |  ✅ 最终选择
🎉 最优解: — 总重量: 0 总价值: 0