多重背包问题-最值问题
Submit solution
Points:
100
Time limit:
1.0s
Memory limit:
40M
Author:
Problem type
Allowed languages
C, C++
🎒 多重背包问题(Bounded Knapsack)
你是一位旅行者,背包最大承重为 W。
现在面前有 N 种不同的物品,每种物品有以下三个属性:
- 重量 w[i](每件的重量)
- 价值 v[i](每件的价值)
- 数量 c[i](最多可以选的件数)
你可以选择若干件物品放入背包中,但同种物品最多选 c[i] 件。
请你求出在不超过背包容量的前提下,你可以获得的最大总价值。
📥 输入格式
第一行包含两个整数 N 和 W,分别表示物品种类数量和背包最大承重。
接下来的 N 行,每行三个整数 w[i]、v[i] 和 c[i],分别表示第 i 种物品的重量、价值和最大数量。
📤 输出格式
输出一个整数,表示可以获得的最大价值。
🧪 输入输出示例
示例 1:
输入:
3 10
3 5 3
4 6 2
2 3 5
输出:
19
说明:
- 选 3 个第 1 种物品(3×3=9 重量,3×5=15 价值)
- 加 1 个第 3 种物品(2 重量,3 价值)
- 总重 11 超了,错误 ❌
- 最优方案是:第 1 种 2 件(6 重),第 3 种 2 件(4 重),价值 2×5 + 2×3 = 16 ✅
- 实际最优值是 19,可以用不同方式得到。
✅ 数据范围
- \( 1 \le N \le 100 \)
- \( 1 \le W \le 10^4 \)
- \( 1 \le w[i], v[i] \le 100 \)
- \( 1 \le c[i] \le 1000 \)
💡 提示
本题是多重背包问题(Bounded Knapsack)。常用算法有:
- 二进制优化:把每种物品按照数量拆分成多个 0/1 背包
- 直接三重循环(小数据)
Comments