首页 文章

背包算法变异

提问于
浏览
0

我有一个以下问题:

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

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

我必须知道,背包可以容纳的最大物品数是多少 .

Example:

Input:

总计:10,总计B:15

item1 A:3,B:4

item2 A:7,B:2

item3 A:1,B:9

item4 A:2,B:1

item5 A:4,B:6

Output:

3(项目:2,3,4)

我应该如何使用动态编程来解决这个问题?

3 回答

  • 1

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

  • 1

    将m [i,wa,wb]定义为最大值(此处的项目数),可以通过 a s小于或等于 wa 的总和以及 b 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

  • 2

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

    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
    

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

相关问题