【问题标题】: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?

谢谢!

【问题讨论】:

    标签: python recursion knapsack-problem


    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多