【问题标题】:Knapsack with one additional constraint带有一个附加约束的背包
【发布时间】:2015-09-09 15:02:46
【问题描述】:

这是一个古老而著名的背包问题:Knapsack Problem
在这里,我有一个约束的背包问题。
我有大小为 W = 100000000N = 100 物品的背包 我为它编写了动态解决方案 我的算法的复杂性是 O(100000000*100) 这两者都太大了时间和空间,但这里有一个条件W ≤ 50000 or max 1≤ i ≤ n Vi ≤ 500.,所以如果我的背包大小超过 50000,我的最大物品价值是有限的。
所以现在我想知道如何在这种情况下减少算法的时间复杂性我认为背包问题取决于背包的大小和物品的数量,那么物品的价值如何改变我的算法?

【问题讨论】:

  • 有一个版本的 DP 运行时间为 O(n V) 而不是 O(n W),其中 n 是项目数,V 是总(整数)值,W是总(整数)权重。
  • @David Eisenstat 接力!请您指导我并解释一下或给我一个可以帮助我的链接

标签: algorithm dynamic-programming knapsack-problem


【解决方案1】:

不要创建大小为W*n 的表,其中每个条目D[x][i] 表示使用第一个i 项最多可以得到x 权重的最佳值(最高),而是使用现在的表D[x][i] 是获得x 值所需的最小权重,使用第一个i 元素:

D(0,i) = 0                i>0
D(x,0) = infinity         x > 0
D(x,i) = infinity         x<0 or i<0
D(x,i) = min{ D(x,i-1), D(x-value[i],i-1) + weight[i])

当你完成后,找到max{ x | D(x,n) &lt;= W) }——这是你能得到的最高值,最多使用W权重,通过对DP矩阵最后一行的线性扫描来完成。

通过一次数据扫描即可检查您需要的变化。

【讨论】:

  • 我说得对吗 x 应该在 1 和最大 1 之间
  • @Daniel.V 不,它应该在 max 和 max(value)*100 之间(假设有 100 个不同的值)。
  • 我知道你的答案是正确的,但我对你的公式感到困惑,你能给一个链接或伪代码吗
  • @Daniel.V 代码与“常规”背包非常相似,但有以下区别: (1) 如上所述的桌子大小。 (2) 选择两个候选者中的最小值(权重)而不是最大值(值)。 (3)重量和数值“开关”部件。您正确理解“常规”背包吗?如果是这样,这应该很容易。
猜你喜欢
  • 2013-06-29
  • 2013-09-19
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
相关资源
最近更新 更多