Algorithm 有界背包特例-单个物品的重量比物品的数量小

Algorithm 有界背包特例-单个物品的重量比物品的数量小,algorithm,knapsack-problem,Algorithm,Knapsack Problem,例如,假设每件物品的价值与其重量相同,且所有重量均为正整数,我想知道,如果单个物品重量与物品数量n相比较小,且背包容量为所有物品重量之和的一半,是否存在优化?e、 g.100k件,每件重量限制为[1,10] 算法应该给出精确解。我知道O(n*W)时间和O(W)空间DP算法,但我认为在这种情况下可能有更好的方法来解决它。提前谢谢 这是一个algo挑战,O(n*W)时间解决方案在功能上是正确的,但速度不够快(比要求的慢一个数量级)。在这个问题上我似乎找不到任何东西。输入是项目权重列表,所需输出是可装

例如,假设每件物品的价值与其重量相同,且所有重量均为正整数,我想知道,如果单个物品重量与物品数量n相比较小,且背包容量为所有物品重量之和的一半,是否存在优化?e、 g.100k件,每件重量限制为[1,10]

算法应该给出精确解。我知道O(n*W)时间和O(W)空间DP算法,但我认为在这种情况下可能有更好的方法来解决它。提前谢谢


这是一个algo挑战,O(n*W)时间解决方案在功能上是正确的,但速度不够快(比要求的慢一个数量级)。在这个问题上我似乎找不到任何东西。输入是项目权重列表,所需输出是可装入背包的项目的最大总值。

您要找的论文是Pisinger 1999,“有界权重背包问题的线性时间算法”。不过这有点痛苦,因为pdf似乎丢失了一些变量上的区别标记

按任意顺序将项目添加到解决方案中,直到您达到一个导致您超过W的项目b—中断项目。。。b-1构成了一个平衡填充物,所有其他平衡填充物都是通过一系列的两个操作可以达到的:

  • A平衡插入是在重量为W的平衡溶液中添加b或b以外的项目
很容易看出两件事:第一,所有平衡解的权重都在W的10个单位以内,第二,最优解必须是平衡解

通过动态规划,我们找到了从初始解到最优解的途径

  • 对于从b开始的每个项目t
  • 对于每个重量w,使得w-9
  • 我们将在b之前跟踪最新的项目s
  • 这样,重量w的平衡填充可以通过仅在s和t之间添加/删除项目来实现
把它通读几遍。请注意,在这个过程中的某个时刻,我们肯定会遇到一个最优的解决方案(尽管直到最后我们才知道)。将wBreak作为添加中断项之前的权重,我们的算法初始化为:

for (w = W-9, w <= W, w++) { s(b-1, w) = 0 }
for (w = W+1, w <= W+10, w++) { s(b-1, w) = 1 }

s(b, wBreak) = b - 1

for(w=w-9,wPisinger 1999纸质背包可在
以及在

正如Bounnap.c

你在寻找这个:@AbhishekBansal:他知道这个解决方案。他需要更好的东西。顺便说一句,如果你有无限背包(这意味着你可以使用每件物品任意多次),并且只有K个不同的权重,那么你只有K个不同的物品(这已经降低了时间复杂性)。他没有提到ILP方法,这就是为什么我让他指向链接。虽然我不能说它更好。所以,为了理解你的例子,如果
n=10^6
,那么你可能有
10^5
重量
1
的物品,以及
10^5
重量
2
的物品,等等
W
,您的目标总重量也会很大?谢谢。这看起来很有希望。@AndyJones“很容易看到两件事:首先,所有平衡溶液的重量都在W的10个单位以内”--我不明白这一点。为什么所有的平衡解都在W的10个单位以内?假设sum\u so\u far=9和W=20,我的break\u item=12,那么(W-sum\u so\u far)=11>10。另外,我在哪里可以找到皮辛格1999年论文的版本?谢谢!@AndyJones:啊,我明白了。我读了OP的问题,现在它有了意义。早些时候,我只读了标题,然后跳到了解决方案。谢谢,很抱歉!@NishantKelkar为了防止其他人感到困惑,一个平衡的解决方案必须在10个单位以内,因为e OP将项目权重限制为[1,10]。至于论文,已经六个月了,但我想我只找到了一个付费版本。现在再看一看,第8章似乎涵盖了类似的内容。网站关闭了,但wayback机器将论文放在了。然而,我尝试使用gcc编译它,我发现了WinMain错误。
for (t = b, t <= N, t++) 
{
    for (w = W-9, w <= W, w++) 
    {
        // Trying adding item t to the solutions with weight <= W 
        s(t, w + w_t) = max( s(t-1, w), s(t-1, w + w_t) )   
    }
    for (w = W+10, w > W, w--)
    {
        // Removing as many items as needed to get back to a balanced filling
        for (j = s(t, w) - 1, j >= s(t-1, w), j--) 
        {
            s(t, w - w_j) = max( s(t, w - w_j), j )
        }
    }
}