Dynamic 背包最大利润

Dynamic 背包最大利润,dynamic,dynamic-programming,knapsack-problem,maximum-profit-problem,Dynamic,Dynamic Programming,Knapsack Problem,Maximum Profit Problem,共有4项:A砝码2LB的利润为40美元,B砝码5LB的利润为30美元,C砝码10LB的利润为50美元,D砝码5LB的利润为10美元。计算背包重量为16磅的4件物品中任何一件的最大总利润。你不能拿走一件物品的任何部分,只能拿走整个 请说明如何用背包问题的方法来解决上述问题。 < P>一个简单的解决方案是考虑项目的所有子集,并计算所有子集的总重量和值。然后,你应该只考虑那些重量小于或等于背包容量的子集。从所有这些子集中,选择最大值子集 考虑项目的所有子集,每个项目可以有两种情况: 该项包含在最佳子

共有4项:A砝码2LB的利润为40美元,B砝码5LB的利润为30美元,C砝码10LB的利润为50美元,D砝码5LB的利润为10美元。计算背包重量为16磅的4件物品中任何一件的最大总利润。你不能拿走一件物品的任何部分,只能拿走整个


请说明如何用背包问题的方法来解决上述问题。

< P>一个简单的解决方案是考虑项目的所有子集,并计算所有子集的总重量和值。然后,你应该只考虑那些重量小于或等于背包容量的子集。从所有这些子集中,选择最大值子集

考虑项目的所有子集,每个项目可以有两种情况:

  • 该项包含在最佳子集中
  • 该项不包括在最佳子集中
假设你背包的容量是W。因此,从n项中可以获得的最大值是以下两个值的最大值

  • 通过n-1项目和W重量获得的最大值(不包括第n项)
  • 第n项的值加上通过n-1项和W减去第n项的重量(包括第n项)获得的最大值
  • 如果第n个项目的重量大于W,则第n个项目不能包括在内,案例1是唯一的选项。这将是一种幼稚的方法,解决方案需要2n时间

    现在,对于重叠子问题:

    weight = {2, 5, 10, 5}
    Capacity = 16
    The recursion tree would look like:       
    // Here n,k -> items remaining, capacity remaining
    // Going to left child -> including the item at hand
    // Going to right child -> excluding the item at hand
                           _______4,16______    
                          /                 \   
                         /                   \
                      3,14                     3,16
                     /    \                    /   \
                    /      \                  /     \
                 2,9        2,14             2,5     2,16
                  \          / \             \         / \
                   \        /   \             \       /   \__
                   1,9   1,4   1,14          1,5     1,6     1,16
                  /\            /\          /\       /\        /  \
                 /  \          /  \        /  \     /  \      /    \
               0,4  0,9      0,9  0,14    0,0 0,0  0,1  0,6   0,11   0,16
    
    由于叶中存在重叠的子问题,我们可以使用动态规划来解决它。如果您存储了这些值,那么以后使用它们会很有效。这里匹配发生在叶节点中,如果您举其他示例,您将看到匹配可能发生在叶节点之前很远的地方

    伪代码如下所示:

    Procedure Knapsack(n, W):    //here, n = number of items, W = capacity of Knapsack
    for i from 0 up to n
        for j from 0 up to W
            if i == 0 or j == 0
                table[i][j] :=0
            else if weight[i-1] <= j
                table[i][j] := max(profit[i-1] + table[i-1][w-weight[i-1]], table[i-1][j])
            else
                table[i][j] := table[i-1][j]
            end if
        end for
    end for
    Return table[n][W]
    
    程序背包(n,W)://这里,n=物品数量,W=背包容量
    对于从0到n的i
    对于从0到W的j
    如果i==0或j==0
    表[i][j]:=0
    
    否则,如果权重[i-1]投票结束,因为OP没有显示任何研究成果。