DP 揹包九講之01揹包

2021-08-23 14:34:21 字數 2613 閱讀 1780

有n件物品和乙個容量為v 的揹包。放入第i件物品耗費的空間是ci,得到 的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。

這是最基礎的揹包問題,特點是:每種物品僅有一件,可以選擇放或不 放。 用子問題定義狀態:即f[i, v]表示前i件物品恰放入乙個容量為v的揹包可以 獲得的最大價值。則其狀態轉移方程便是:

先考慮上面講的基本思路如何實現,肯定是有乙個主迴圈i = 1..n,每次 算出來二維陣列f[i, 0..v ]的所有值。那麼,如果只用乙個陣列f[0..v ],能不 能保證第i次迴圈結束後f[v]中表示的就是我們定義的狀態f[i, v]呢?f[i, v]是 由f[i − 1, v]和f[i − 1, v − ci ]兩個子問題遞推而來,能否保證在推f[i, v]時(也 即在第i次主迴圈中推f[v]時)能夠取用f[i − 1, v]和f[i − 1, v − ci ]的值呢?事 實上,這要求在每次主迴圈中我們以v = v..0的遞減順序計算f[v],這樣才能保 證推f[v]時f[v − ci ]儲存的是狀態f[i − 1, v − ci]的值。

恰好裝滿揹包時的最優解

在容量範圍內時的最優解

這是為什麼呢?可以這樣理解:初始化的f陣列事實上就是在沒有任何物 品可以放入揹包時的合法狀態。如果要求揹包恰好裝滿,那麼此時只有容量 為0的揹包可以在什麼也不裝且價值為0的情況下被「恰好裝滿」,其它容量的 揹包均沒有合法的解,屬於未定義的狀態,應該被賦值為-∞了。如果揹包並非 必須被裝滿,那麼任何容量的揹包都有乙個合法解「什麼都不裝」,這個解的 價值為0,所以初始時狀態的值也就全部為0了。 這個小技巧完全可以推廣到其它型別的揹包問題。

裸題:直接初始化加公式

解析:根據題目,我們就是要找到min(m - dp[m-5] - w[k])

其中dp[m-5] 是保證錢包剩餘5元以上時的最大消費。

先把貪心的假設拿出來(思維的跳躍,先擺出假設,再證明)。

我們設最優解是dp[m-5]且做01揹包的時候不考慮最大的w[k],那麼剩下的錢最後買w[k],設ans = m - dp[m-5] - max

假設存在其他的方案:ans' = m - dp'[m-5] - t 。  下面我們就討論max 和 t 的關係以及 dp 和 dp' 之間的策略

首先我們對w進行排序(實際做的時候不用排序,只需要存在最大值的下標就行,減小複雜度)

w[1]

....

w[i]

....

w[j]

....

w[n]

min..

..min'

....t..

..max

ans = m - dp[m-5] - max  和  ans' = m - dp'[m-5] - t  的比較

那麼關鍵證明就是:(max >=t)

① 若dp[m-5] >= dp'[m-5] 顯然 ans<=ans'   那麼貪心策略一定正確

② 若dp[m-5] < dp'[m-5] 那麼繼續做出假設。

假設dp'[m-5]選取若干個w的值,其中包括max,但是在沒有被選取的w中,t是最大的(因為最後剩下的錢一定會去買最大的)

那麼 對於dp[m-5] 一定是沒有選取max的,和dp'[m-5]對比一下,一定會把t給選進去,或者說若干個較小的w的求和》=t的值選入進去(如果有若干個min''沒有被選擇的值加起來》=t而又dp'[m-5] = wp1 + wp2 + wp3 +.... + max

dp[m-5] = wp1 + wp2 + wp3 + .....+ t (或者

那麼dp'[m-5] - dp[m-5] < = max - t 

因此證明了ans <= ans'。

綜上所述,題目可以等價於:貪心 + 01 揹包

題目分析:

DP 揹包九講之01揹包

有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,每行兩個整數 ...

DP 揹包九講之01揹包

有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,每行兩個整數 ...

揹包九講之 01揹包

01揹包是最基礎的揹包問題,其中01代表的就是第i個物品的選或不選,在此先設v i 為體積,w i 為價值。很顯然,我們可以使用二位陣列dp i j 來表示前i個物品在揹包容量為j的時候可存放的最大價值。首先dp 0 0 0是很顯然的。而計算dp i j 時,存在01兩種情況 選或不選第i件物品。1...