1268:【例9.12】完全背包问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 32325 通过数: 17348 【题目描述】 设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M ,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M ,而价值的和为最大。 【输入】 第一行:两个整数,M (背包容量,M≤200 )和N (物品数量,N≤30 ); 第2..N+1 行:每行二个整数Wi,Ci ,表示每个物品的重量和价值。 【输出】 仅一行,一个数,表示最大总价值。 【输入样例】 10 4 2 1 3 3 4 5 7 9 【输出样例】 max=12
时间: 2023-05-26 17:03:08 浏览: 97
背包问题,存在最大价值
题意描述
有 $n$ 种物品,每种物品有一个重量 $w_i$ 和价值 $v_i$,数量不限。将它们装入重量为 $M$ 的背包,使得背包内物品的总价值最大。输出该最大总价值。
分析
完全背包问题,可使用 DP 解决,无法使用贪心策略。DP 状态定义为 $f(i,j)$:考虑前 $i$ 件物品,背包容量为 $j$ 时所能获得的最大价值。
考虑 $w_i \le j$ 时,可以将第 $i$ 种物品放入背包。则有 $f(i,j) = f(i,j-w_i)+v_i$。
否则,无法将此物品放入背包,因此最优策略是不选第 $i$ 种物品。则有 $f(i,j) = f(i-1,j)$。
最终答案为 $\max\limits_{j=0}^M f(n,j)$。
在 DP 中,循环枚举的顺序很重要。在完全背包问题中,每件物品可以无限次选取,因此对于每一种物品 $i$,我们应当考虑选取 $0, 1, 2, \ldots, \lfloor \frac{M}{w_i} \rfloor$ 件物品。因此枚举顺序为:先枚举物品,再枚举背包容量。
具体实现中,每种物品的枚举应当采用倒序,即从大到小枚举,这样可以避免多次使用某件物品。
代码实现
代码实现非常简单,只需根据状态转移方程填写 DP 数组即可,时间复杂度为 $O(NM)$。
阅读全文