01揹包知識點

2022-10-09 12:21:06 字數 1510 閱讀 5128

\(有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。\)

狀態表示

狀態計算

根據最後一步劃分為兩類,一類為所有不選第\(i\)個物品的方法,另一類為選第\(i\)個物品的選法

得到轉移方程

\[f[i][j] = max(f[i-1][j],f[i-1][j-v] + w)

\]code\(有 n 種物品和乙個容量是 v 的揹包,每種物品都有無限件可用。\)

狀態表示

狀態計算

根據第\(i\)個物品選取多少個來進行集合的劃分,可以得到狀態轉移方程。

\[f[i][j] =max(f[i-1][j-k*v]+k*w)\\(k*v<=j)

\]code\(有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 s_i件,每件體積是 v_i,價值是 w_i。\)

狀態表示

狀態計算

參考01揹包思路,我們對集合進行劃分,每一子集為對該類物品選了若干個,每次選或不選兩種操作。

即得到轉移方程

\[f[i][j]=max(f[i-1][j-k*v]+w*k,f[i-1][j])\\

k \in0,1,2,3,4...s_i

\]code\(有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 s_i件,每件體積是 v_i,價值是 w_i\)

二進位制優化

對於每種物品,以二進位制的形式進行乙個打包成乙個新的物品,將問題轉化為01揹包問題,對每個新物品進行選或不選兩種操作,用該方法可以完全列舉選取\(0-s_i\)的所有選法。

code

二進位制優化+01揹包一維優化

int cnt = 0;

for (int i = 1; i <= n; ++i)

if (s > 0)

}n = cnt;

for (int i = 1; i <= n; ++i)

for (int j = m; j >= v[i]; --j)

f[j] = max(f[j], f[j-v[i]] + w[i]);

基於滑動視窗優化

空間優化的多重揹包轉移方程為

\[f[j] = max(f[j], f[j-k*v]+k*w)

\]我們可以將它正序過來,則有以下狀態

\[f[m] = max(f[0], f[v]+w, f[2*v]+2*w... f[k*v+j]+k*w)\\

m = k*v+j\\

0<=j

不難發現,每一類中的最大值都是在同一層的dp陣列中轉移而來,在這裡可以使用單調佇列進行優化,最後求取單調佇列中的最大值。

code-\(o(nv)\)

\[有 n 組物品和乙個容量是 v 的揹包。\\

每組物品有若干個,同一組內的物品最多只能選乙個。\\

每件物品的體積是 v_,價值是 w_,其中i是組號,j是組內編號。

\]狀態表示

狀態計算

分成若干組,按照01揹包進行計算,每組選或不選兩種情況。

code

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...

軟考知識點 01

定義 棧是一種特殊的線性表,只允許從一端刪除和插入。允許插入和刪除的一端為棧頂,另一端為棧底 分類 順序儲存和鏈結儲存棧 順序儲存 可以用順序儲存線性表來表示棧,為了指明當前執行插入和刪除的棧頂位置,需要乙個位址變數top指出棧頂結點在陣列中的下標。鏈結儲存棧 棧也可以用鍊錶實現,用鍊錶實現的棧稱為...

小知識點備註01

1 webservice同步非同步操作 同步 private void button1 click object sender,eventargs e 非同步 private void button2 click object sender,eventargs e private void reve...