92 揹包問題

2021-10-02 06:34:46 字數 2257 閱讀 9773

寫在前面,如果有更好的方法可以給博主分享一下麼,木有vip,看不到lintcode的題解,謝謝啦

在n個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小為m,每個物品的大小為a[i]

樣例輸入:[3, 4, 8, 5],  backpack size = 10

輸出:9

挑戰o(n x m) time and o(m) memory.

暴力求解所有可能性,自頂向下

_helper(self, w, index, c)函式,表示考慮求解將[0,index]的物品放入容量為c的揹包中,能得出的最大容量,遞迴函式

class solution:

def backpack(self, m, a):

# write your code here

n = len(a)

return self.helper(m, n - 1, a)

def helper(self, capacity, idx, a):

if capacity <= 0 or idx < 0:

return 0

res = self.helper(capacity, idx - 1, a)

if capacity >= a[idx]:

res = max(res, self.helper(capacity - a[idx], idx - 1, a) + a[idx])

return res

水到渠成的記憶化搜尋

class solution:

def __init__(self):

self.rec = none

def backpack(self, m, a):

# write your code here

n = len(a)

self.rec = [[-1] * (m + 1) for _ in range(n)]

return self.helper(m, n - 1, a)

def helper(self, capacity, idx, a):

if capacity <= 0 or idx < 0:

return 0

if self.rec[idx][capacity] != -1:

return self.rec[idx][capacity]

res = self.helper(capacity, idx - 1, a)

if capacity >= a[idx]:

res = max(res, self.helper(capacity - a[idx], idx - 1, a) + a[idx])

self.rec[idx][capacity] = res

return res

時間和空間複雜度均為

class solution:

def backpack(self, m, a):

if not a or m <= 0:

return 0

dp = [[0] * (m + 1) for _ in range(len(a))]

for j in range(m + 1):

if j >= a[0]:

dp[0][j] = a[0]

for i in range(1, len(a)):

for j in range(m + 1):

dp[i][j] = dp[i-1][j]

if j - a[i] >= 0:

dp[i][j] = max(dp[i][j], dp[i - 1][j - a[i]] + a[i])

return dp[-1][-1]

空間的優化,時間複雜度因為上面的dp[i][j],只用到了,dp[i-1][j]及其左側元素,不涉及右側元素,故可以只用

class solution:

def backpack(self, m, a):

if not a or m <= 0:

return 0

dp = [0] * (m + 1)

for i in range(0, len(a)):

j = m

while j >= a[i]:

dp[j] = max(dp[j], dp[j - a[i]] + a[i])

j -= 1

return dp[-1]

演算法作業9 2 揹包問題

乙個旅行者準備隨身攜帶乙個揹包。可以放入揹包的物品有n種,物品 j的重量的價值分別為 wj,vj,j 1,2,n 如果揹包的最大重量限制是b,怎麼選擇放入揹包物品以使得揹包的價值最大。目標函式 價值 約束條件 總量 其中x j表示放入揹包的第j種物品的數量 當前fk 1 y1 最大價值 後續兩種策略...

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

01揹包問題 完全揹包問題 多重揹包問題

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...