問題描述:有一個揹包,他的容量爲C。現在有n種不同的物品 編號爲0...n-1,其中每一件物品的重量爲w(i),價值爲v(i)。問可以向這個揹包中存放哪些物品,使得在不超過揹包容量的基礎上,物品的總價值最大
解決思路:
1. 暴力解法:每個物品都可以放進或者不放進揹包,2^n種情況。n次運算選擇最大的。
時間複雜度O((2^n)*n)
2. 動態規劃:狀態F(n, C) 爲將n個物品放進容量C的揹包的最優解。(一個狀態兩個參數:n, C)
i 狀態 有兩種選擇: 放進第i個物品 和 不放 第i個物品
狀態轉移方程爲: F(i, C) = max{ v(i)+F(i-1, C-w(i)) , F(i-1,C) }
github: https://github.com/lzneu/Algrithm_python
python代碼實現:
class Solution:
def backPack(self, w, v, C):
'''
:param w: list
:param v: list
:param C: int 揹包最大容量
:return: int
'''
n = len(w)
if n == 0 or C == 0:
return 0
row = [-1 for i in range(C+1)]
memo = [row.copy() for i in range(n)]
# 第一行計算
for i in range(C+1):
if i >= w[0]:
memo[0][i] = v[0]
else:
memo[0][i] = 0
for i in range(1, n): # 增加i個物品後的最優化計算
for j in range(C+1): # 第i個物品 第j個位置的最大價值
if j >= w[i]:
memo[i][j] = max(v[i]+memo[i-1][j-w[i]], memo[i-1][j])
else: # j < w[i]
memo[i][j] = memo[i-1][j]
return memo[n-1][C]
# 測試
w = [1,2,3]
v = [6,10,12]
C = 5
print(Solution().backPack(w, v,C))