寫在前面,如果有更好的方法可以給博主分享一下麼,木有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 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...