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 22:03:08 浏览: 102
题意描述
有 $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)$。
相关问题
1268:【例9.12】完全背包问题
完全背包问题是一个经典的动态规划问题,在给定背包容量和一组物品的重量和价值的情况下,如何选择物品放入背包中,使得总价值最大化。
举个例子来说明,假设背包容量为C,有n个物品,每个物品的重量分别为w1, w2, ..., wn,对应的价值为v1, v2, ..., vn。我们需要选择哪些物品放入背包中,使得总价值最大。
可以使用动态规划的方法来解决这个问题。定义一个二维数组dp[i][j],其中dp[i][j]表示前i个物品放入容量为j的背包中所能达到的最大价值。
状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i][j-wi] + vi)
其中,dp[i-1][j]表示不选择第i个物品,dp[i][j-wi] + vi表示选择第i个物品放入背包中。
最终的结果就是dp[n][C],即前n个物品放入容量为C的背包中所能达到的最大价值。
这个问题可以通过动态规划的思想进行求解,时间复杂度为O(nC)。同时可以通过空间优化,将二维数组优化为一维数组,降低空间复杂度为O(C)。
postman9.12
Postman是一款常用的API测试工具,可以方便地进行API接口的测试、调试、文档编写等工作。Postman 9.12是Postman的一个版本,相对于之前的版本,它增加了很多新的功能和优化,例如:
1. 增加了GraphQL查询语言的支持;
2. 新增了API监视器,可以方便地监控API的性能和可靠性;
3. 改进了API文档的编写和分享功能;
4. 提升了测试用例的编写和运行效率;
5. 支持多种操作系统和平台。
如果你需要进行API接口测试或者开发工作,Postman是一个非常值得推荐的工具。同时,通过使用Postman,你还可以更好地理解API接口的使用方法和规范。希望我的回答能够帮到你。
阅读全文