双背包算法

时间:2016-08-16 15:01:11

标签: algorithm knapsack-problem

假设你有一个带有易碎物品的仓库(例如蔬菜或水果),你只能拿出一次带蔬菜的容器。如果你移动它们两次,它们会腐烂得太快而且不能再出售了。

因此,如果您为每个蔬菜容器赋予一个价值(取决于它们还能保持新鲜多久),您希望首先销售最低价值。当一个客户要求一定的重量时,你想要提供一个好的服务,并给出准确的重量(所以你需要从你的仓库中取出一些额外的东西,并在销售后扔出额外的一点)。

我不知道这个问题是否有名字,但我认为这是背包问题的双重形式。在背包问题中,您希望最大化该值并将重量限制到最大值。在这里,您希望最小化该值并将重量限制到最小。

通过将仓库视为背包,并将仓库的最大值和有限重量优化到最大当前重量减去客户要求的数量,您可以轻松地看到这种二元性。

然而,许多解决背包问题的实用算法依赖于这样的假设:与您可以选择的总重量相比,您可以携带的重量很小。 F.E. dynamic programming 0/1解决方案依赖于循环,直到达到最大权重,FPTAS解决方案保证在总重量的(1-e)因子内是正确的(但是很小的因素)价值仍然可以产生很大的差异。)

所以当想要的体重很大时,两者都有问题。

因此,我想知道是否有人研究过"双背包问题"已经(如果可以找到一些文献),或者对我现有的算法进行了一些简单的修改。

1 个答案:

答案 0 :(得分:3)

用于解决背包的常用假多项式DP算法要求,对于每个i和w,&#34;如果我使用最多w容量,我可以从前i个项目获得的最大总值是多少?&#34; < / p>

对于每个i和w,你可以问一下,如果我使用至少w容量,我可以从前i个项目得到的最小总值是多少?&#34;逻辑几乎是相同的,除了比较的方向是相反的,你需要一个特殊的值来记录即使把第一个i项中的所有i都达不到容量的可能性 - 无穷大也适用于此,因为你想要当与min()进行比较时,该值将与任何有限值相比失去。