Algorithm 双背包算法

Algorithm 双背包算法,algorithm,knapsack-problem,Algorithm,Knapsack Problem,假设你有一个仓库,里面有易碎品(如蔬菜或水果),你只能拿出一个装有蔬菜的容器一次。如果你移动它们两次,它们会腐烂得太快,再也卖不出去了 因此,如果你给每一个容器的蔬菜一个价值(取决于它们保持新鲜的时间),你首先要卖最低价值的蔬菜。当客户要求一定的重量时,你希望提供良好的服务,并给出确切的重量(因此你需要从仓库中取出一些额外的重量,并在出售后将多余的部分扔掉) 我不知道这个问题是否有名字,但我认为这是背包问题的双重形式。在背包问题中,您希望使值最大化,并将重量限制在最大值。在这里,您希望将值最小化

假设你有一个仓库,里面有易碎品(如蔬菜或水果),你只能拿出一个装有蔬菜的容器一次。如果你移动它们两次,它们会腐烂得太快,再也卖不出去了

因此,如果你给每一个容器的蔬菜一个价值(取决于它们保持新鲜的时间),你首先要卖最低价值的蔬菜。当客户要求一定的重量时,你希望提供良好的服务,并给出确切的重量(因此你需要从仓库中取出一些额外的重量,并在出售后将多余的部分扔掉)

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

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

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

因此,当想要的重量很大时,两者都有问题


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

解决背包问题的常用伪多项式DP算法,对于每个I和w,“如果我使用最多w容量,我可以从第一个I项获得的最大总价值是多少?”


相反,你可以问,对于每个i和w,“如果我使用至少w容量,我能从第一个i项得到的最小总值是多少?”?“逻辑几乎是相同的,只是比较的方向是相反的,并且您需要一个特殊的值来记录这样一种可能性,即即使取第一个i项中的所有i也无法达到w容量——无穷大适用于这一点,因为您希望在与min()进行比较时,该值与任何有限值相比都有所损失。

谢谢,我想我现在明白了,但我必须先实现它,然后才能确定。在实现它之后,我发现一个具有负权重或零权重的sack的值需要定义为零(由于反向比较,您可以查询负权重的值)。当您可以在0个元素之间进行选择时,sack的初始化实际上必须导致一个无穷大的值(或大于其他值)。