多重背包问题-最值问题


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

There are no comments at the moment.