无重复背包与有重复背包的不同应用

Posted

技术标签:

【中文标题】无重复背包与有重复背包的不同应用【英文标题】:Different Applications for between Knapsack Without Reptition and Knapsack With Repetition 【发布时间】:2015-11-03 08:20:10 【问题描述】:

我想知道是否存在仅使用一种或另一种可以解决的情况(即仅使用重复的背包或不重复的背包),或者两者是否总是可以相互还原。

为了清楚起见,给定 n 个项目 [1...n],其中项目 i 的权重为 w_i,价值为 v_i,并试图选择项目的组合以使总价值最大化,而总重量小于一些 W。

不重复的背包公式(就动态规划而言)是

K(w, j) = maxK(w-w_j, j-1) + v_j, K(w, j-1)

其中 K(w, j) 是指使用容量为 k 的背包和物品 1...j 可达到的最大值,而重复背包的公式为

K(w) = maxK(w-w_i) + v_i | w_i <= w

其中 K(w) 是容量为 w 的背包可实现的最大重量。

【问题讨论】:

【参考方案1】:

您始终可以将带有重复的背包简化为不重复的背包,但反之则不行。要将一个有重复的背包减少到一个没有重复的背包,只需将每个对象添加与背包容量一样多的次数。您可以认为您永远无法在背包中放入更多实例,因此结果将与拥有无限多个副本相同。

为了证明没有重复的背包不能还原为有重复的背包,请考虑以下示例:

您有 3 个对象,分别标有价格和重量:(100$, 1kg)、(10$, 2kg) 和 (20$, 3kg)。还可以想象我们的背包可以装 3 公斤。如果我们允许重复,最好的解决方案是取第一种类型的 3 个对象,但不重复最好的解决方案是取第一个和第二个对象,这样利润会小得多。

【讨论】:

以上是关于无重复背包与有重复背包的不同应用的主要内容,如果未能解决你的问题,请参考以下文章

有重复的背包 - 数组解决方案

没有重复的背包:最大数量的金币

如何实现回溯打印背包中的物品(允许重复物品)?

在实施与经典 0-1 背包类似情况的解决方案时重复项目

没有重复的背包:最大数量的黄金 - Python 代码问题

数据结构与算法简记--动态规划