背包问题 - 如何获得剩余容量

Posted

技术标签:

【中文标题】背包问题 - 如何获得剩余容量【英文标题】:Knapsack Problem - how to get the remaining capacity 【发布时间】:2020-12-05 17:01:36 【问题描述】:

我正在尝试练习我的python技能,所以我尝试“玩”背包问题。

我用过这个算法

def knapSack(W, wt, val, n): 
  
    if n == 0 or W == 0: 
        return 0
    if (wt[n-1] > W): 
        return knapSack(W, wt, val, n-1) 

    else: 
        return max( 
            val[n-1] + knapSack( 
                W-wt[n-1], wt, val, n-1), 
            knapSack(W, wt, val, n-1)) 
  

我不知道最后如何计算剩余容量, 例如,如果我的 val 列表是 [4,2,1,5,3] 并且权重是 [3,5,1,2,4] 并且我的容量(W)是 4,那么它将返回 6 并且剩余容量为 1 我怎样才能得到这个 1?

谢谢!

【问题讨论】:

【参考方案1】:

记忆技术(递归方法的扩展)。 这种方法基本上是递归方法的扩展,因此我们可以克服计算冗余案例的问题,从而增加复杂性。我们可以通过简单地创建一个二维数组来解决这个问题,如果我们第一次得到它可以存储一个特定的状态 (n, w)。现在,如果我们再次遇到相同的状态 (n, w) 而不是以指数复杂度计算它,我们可以直接以恒定时间返回其存储在表中的结果。这种方法在这方面优于递归方法。

val = [4,2,1,5,3] 
wt = [3,5,1,2,4]] 
W = 4
n = len(val) 


t = [[-1 for i in range(W + 1)] for j in range(n + 1)] 

def knapsack(wt, val, W, n): 

    if n == 0 or W == 0: 
        return 0
    if t[n][W] != -1: 
        return t[n][W] 

    if wt[n-1] <= W: 
        t[n][W] = max( 
            val[n-1] + knapsack( 
                wt, val, W-wt[n-1], n-1), 
              knapsack(wt, val, W, n-1)) 
        return t[n][W] 
    elif wt[n-1] > W: 
        t[n][W] = knapsack(wt, val, W, n-1) 
        return t[n][W]

请试试这个!

【讨论】:

谢谢!有没有办法在没有备忘录的情况下做到这一点? 是的,可以,有递归,但时间复杂度为 2^n(n 个项目)。另一种方法是在此链接中使用临时数组,结帐方法2 -> geeksforgeeks.org/0-1-knapsack-problem-dp-10【参考方案2】:

也许这会有所帮助!我在这里使用memoization

def knapsack(n, W):
    """Recursive solution"""
    arr = [[None for _ in range(W+1)] for _ in range(n+1)]

    if arr[n][W] != None: return arr[n][W]
    if n == 0 or W == 0:
        res = 0
    elif weights[n-1] > W:
        res = knapsack(n-1, W)
    else:
        tmp1 = knapsack(n-1, W)
        tmp2 = weights[n-1] + knapsack(n-1, W-weights[n-1])
        res = max(tmp1, tmp2)
    arr[n][W] = res
    return arr[n][W]

【讨论】:

以上是关于背包问题 - 如何获得剩余容量的主要内容,如果未能解决你的问题,请参考以下文章

动态规划--01背包问题

背包复习

动态规划求解0-1背包问题

装箱问题0-1背包问题

装箱问题0-1背包问题

装箱问题0-1背包问题