2 揹包問題:最多能裝多滿
阿新 • • 發佈:2021-02-03
技術標籤:揹包問題
在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