Python實現揹包問題:求解可多次選取物品的最大價值
假設我們有兩個長度相同的列表,分別稱為weights(重量)和values(價值),還有一個capacity(容量)值。其中weights[i]和values[i]分別表示第i個物品的重量和價值。如果我們最多可以承受capacity重量,並且可以對每個物品選取任意數量的副本,我們需要找到可以獲得的最大價值。
例如,如果輸入為weights = [1, 2, 3],values = [1, 5, 3],capacity = 5,則輸出為11。
為了解決這個問題,我們將遵循以下步驟:
- 定義一個函式dp()。它將接收i和k作為引數。
- 如果i等於weights的長度,則
- 返回0
- ans := dp(i + 1, k)
- 如果k >= weights[i],則
- ans := ans和dp(i, k - weights[i]) + values[i]中的最大值
- 返回ans
- 在主方法中執行以下操作:
- 返回dp(0, capacity)
讓我們看下面的實現來更好地理解:
示例
class Solution: def solve(self, weights, values, capacity): def dp(i, k): if i == len(weights): return 0 ans = dp(i + 1, k) if k >= weights[i]: ans = max(ans, dp(i, k - weights[i]) + values[i]) return ans return dp(0, capacity) ob = Solution() weights = [1, 2, 3] values = [1, 5, 3] capacity = 5 print(ob.solve(weights, values, capacity))
輸入
[1, 2, 3], [1,5,3], 5
輸出
11
廣告