【问题标题】:Knapsack algorithm variation背包算法变体
【发布时间】:2013-11-26 09:36:44
【问题描述】:

我遇到了以下问题:

有一组项目,每个项目有2个不同的正值A和B。

背包有两个值:totalA 和totalB。这是所选项目的值 A 和 B 的最大总和。

我必须弄清楚,背包最多可以容纳多少物品。

示例:

输入:

总A:10,总B:15

项目1 A:3,B:4

项目2 A:7,B:2

项目 3 A:1, B:9

项目 4 A:2, B:1

项目 5 A:4, B:6

输出:

3(项目:2、3、4)

我应该如何使用动态规划来解决这个任务?

【问题讨论】:

标签: algorithm dynamic-programming knapsack-problem


【解决方案1】:

这被称为“多重约束背包问题”(MKP,有时呈现为 d-KP)。它可以像常规背包问题一样在伪多项式时间内解决,但您需要一个二维表而不是一个。

【讨论】:

    【解决方案2】:

    将 m[i,wa,wb] 定义为最大值(此处的项目数),可以通过 as 的总和小于或等于 wab 的总和来获得s 小于或等于 wb,使用最多 i 的项目。

    m[i,wa,wb] = m[i-1,wa,wb]
    

    如果item[i].a > waitem[i].b > wb

    m[i,wa,wb] =  max (m[i-1, wb, wb], m[i-1, wa - item[i].a, wb - item[i].b] + 1)
    

    如果item[i].a <= waitem[i].b <= wb

    【讨论】:

      【解决方案3】:

      这是一个可能对您有所帮助的递归方程:-

      if(Items[N].b<=Wa && Items[N].b<=Wa)
          Value(N,Wa,Wb) = max(1+Value(N-1,Wa-Items[N].a,Wb-Items[N].b),Value(N-1,Wa,Wb)) 
      
      else Value(N,Wa,Wb) = Value(N-1,Wa,Wb)
      
      Where Wa = Current capacity of A sack & Wb of B sack
            N = no of items considered
      

      注意:您可以在递归解决方案中使用哈希表实现,这将防止三维数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 2011-12-02
        相关资源
        最近更新 更多