【问题标题】:Knapsack algorithm with special objects带有特殊物体的背包算法
【发布时间】:2018-03-29 11:33:32
【问题描述】:

我需要为扩展背包问题创建算法,其中我们有特殊物品和普通物品,我只能打包几个特殊物品。

所以,我们有 N 个项目,并且我们知道每个项目的重量/价值/isSpecial。我们还定义了 S,这是特殊项目的最大数量。

有什么想法吗?

【问题讨论】:

  • 请将其形式化,然后检查整数编程是否可行。
  • 特殊物品限制不能和重量限制一视同仁吗?
  • @myrtlecat 不,你不能。您只有简单的项目列表,其中包含权重/值以及关于每个项目是否特殊的知识。您可以像使用普通物品一样使用特殊物品,但是每次使用特殊物品时,您都必须增加计数器,不能超过给定的数量(通常是小的)
  • 如果我理解正确的话,对特殊物品的限制可以重新表述为第二个重量限制如下:普通物品的“特殊重量”为0,特殊物品的“特殊重量”为1 ,并且总的“特殊重量”不得超过 S。从数学上讲,原始重量限制和“特殊重量”限制可以同等对待,这给出了以下 @Codor 的解决方案。
  • @myrtlecat,是的,你是对的。感谢您的帮助

标签: algorithm dynamic-programming knapsack-problem


【解决方案1】:

该问题可以建模为一个非几何背包问题,其中每个物品有两个重量(即实际重量和第二个重量,即1,当且仅当它是特殊) ;第一个重量容量是背包容量,第二个重量容量是特殊物品的期望最大数量。根据this Wikipedia 文章,已知问题是NP-complete,除非P=NP,否则不承认FPTAS,但承认FPTAS。显然,二维版本也承认类似于一维版本的动态规划算法。状态空间的语义如下,其中每个项目有两个权重w1[i]w2[i] 和利润p[i],其中C1C2 是各自的容量。

P[i,j,k] := maximum profit attainable for items in {1,...,i} with weight
            in the first component at most j and weight in the second
            component at most k
            
            for any i in {1,...,N}
                    j in {1,...,C1}
                    k in {1,...,C2}

递归关系如下。

P[i,j,k] = max{ P[i-1,j-w1[i],k-w2[k]] + p[i], // item i occurs
                P[i-1,j,k]                     // item i does not occur
              }

在实际实现中,需要进行一些索引检查来确定第一种情况是否实际发生。

【讨论】:

  • 很好的答案,谢谢。能否提供代码或更详细的伪代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多