背包问题 - 如何获得剩余容量
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]
【讨论】:
以上是关于背包问题 - 如何获得剩余容量的主要内容,如果未能解决你的问题,请参考以下文章