1. 程式人生 > 其它 >2 揹包問題:最多能裝多滿

2 揹包問題:最多能裝多滿

技術標籤:揹包問題

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

原始揹包問題考慮的是價值最大化,而這個揹包考慮的是重量最大化,沒有價值。 我們可以將dp的定義改為,前i個物品能不能裝滿j。在初始問題中是裝下,這次是裝滿。這樣的話,就不可能存在不拿這個選項,如果不拿,說明要麼裝不下,要麼裝不滿。

class Solution:
    """
    @param m: An integer m denotes the size of a backpack
    @param A: Given n items with size A[i]
    @return: The maximum size
    """
def backPack(self, m, A): # write your code # dp表示第i個物品能否裝滿j dp = [0 for _ in range(m+1)] dp[0] = 1 result = 0 for a in A: for i in range(m, a-1, -1): dp[i] = dp[i-a] if dp[i] and i > result: result =
i if i == m: return m return result

注意,這個程式是有一個bug的,如果前面已經能裝滿較大的揹包了,後面其實不會考慮,會重新看能不能裝滿,不會考慮是否已經滿了。可以加一個限制條件,當為1時不用再被更新。下列程式碼的dp陣列是完整的,速度也很快。注意,當m能被裝滿時可做剪枝,提升速度。

class Solution:
    """
    @param m: An integer m denotes the size of a backpack
    @param A: Given n items with size A[i]
    @return: The maximum size
    """
def backPack(self, m, A): # write your code # dp表示第i個物品能否裝滿j dp = [0 for _ in range(m+1)] dp[0] = 1 for a in A: for i in range(m, a-1, -1): if not dp[i]: dp[i] = dp[i-a] if dp[i] and i == m: return m for i in range(m, 0, -1): if dp[i]: return i