背包多重约束

我有一个动态编程问题,我花了几个小时研究无济于事。

第一部分很简单:你有背包的物品,你必须最大限度地发挥这些物品的价值,同时保持它们低于一定的重量。

问题的第二部分是相同的,除了现在还有一个项目限制。 例如:

您可以放入包中的物品的最大价值是多少,以便在重量和物品限制下价值最大化?

我不知道如何实现这个问题的第二部分,我寻找一个通用算法。


在没有项目限制的动态规划解决方案中,您有二维矩阵,其中Y轴是项目索引,X轴是重量。 然后对于每件商品,您选择最大的重量对

  • 包括物品的重量值,如果物品重量<=重量限制
  • 不包括物品的重量值
  • 以下是Python中标准解决方案的示例:

    def knapsack(n, weight, values, weights):
        dp = [[0] * (weight + 1) for _ in range(n + 1)]
    
        for y in range(1, n + 1):
            for x in range(weight + 1):
                if weights[y - 1] <= x:
                    dp[y][x] = max(dp[y - 1][x],
                                   dp[y - 1][x - weights[y - 1]] + values[y - 1])
                else:
                    dp[y][x] = dp[y - 1][x]
    
        return dp[-1][-1]
    

    现在,当您添加项目限制时,您必须为每个项目选择最大值,值,从中使用三项组合的项目数

  • 如果物品重量<=重量限制,则包括物品在内的重量值和n个物品
  • 重量值和不包括物品的n件物品
  • 为了表示项目的数量,您可以将第三维添加到之前使用的表示已使用项目数量的矩阵中:

    def knapsack2(n, weight, count, values, weights):
        dp = [[[0] * (weight + 1) for _ in range(n + 1)] for _ in range(count + 1)]
        for z in range(1, count + 1):
            for y in range(1, n + 1):
                for x in range(weight + 1):
                    if weights[y - 1] <= x:
                        dp[z][y][x] = max(dp[z][y - 1][x],
                                          dp[z - 1][y - 1][x - weights[y - 1]] + values[y - 1])
                    else:
                        dp[z][y][x] = dp[z][y - 1][x]
    
        return dp[-1][-1][-1]
    

    简单演示:

    w = 5
    k = 2
    values = [1, 2, 3, 2, 2]
    weights = [4, 5, 1, 1, 1]
    n = len(values)
    
    no_limit_fmt = 'Max value for weight limit {}, no item limit: {}'
    limit_fmt = 'Max value for weight limit {}, item limit {}: {}'
    
    print(no_limit_fmt.format(w, knapsack(n, w, values, weights)))
    print(limit_fmt.format(w, k, knapsack2(n, w, k, values, weights)))
    

    输出:

    Max value for weight limit 5, no item limit: 7
    Max value for weight limit 5, item limit 2: 5
    

    请注意,您可以针对内存消耗优化示例,因为向解决方案添加第z项时,您只需知道z-1项的解决方案。 你也可以检查是否有可能将z物品放在重量限制之下,并且如果不能相应地减少物品限制。

    链接地址: http://www.djcxy.com/p/59947.html

    上一篇: knapsack multiple constraints

    下一篇: Knapsack with an amount limitation