關於雙端佇列優化多重揹包問題的學習筆記

2021-08-03 17:33:04 字數 641 閱讀 2322

problem:有n種物品,它們的重量和價值分別是wi和vi。現在要從中選出一些物品使得總重量不超過w,並且價值的和最大。第i種物品最多取mi個。

暴力演算法分析:三重迴圈列舉物品,揹包容量,物品個數。效率為o(nw∑mi)

組合數優化:如果用1,2.....2^k的組合來表示0到0~2^(k+1)-1的所有整數的話。

可以在o(nw∑ log2(mi))的效率內解決問題。

雙端佇列優化: 可以在o(nw)的時間複雜度內實現。

dp[i][j]:到第i個物品為止總重量不超過j的所有選法中最大的可能價值。

dp[i+1][j]=max

在這個方程的轉移中,j mod w[i]的值不同則之間的不存在轉移關係。

我們首先考慮一下 j mod w[i]=0的情況

定義 a[j]=dp[i][j*w[i]]

那麼轉移方程就可以改寫為dp[i+1][j+k*w[i]]=max(a[j]+k*v[i],a[j+1]+(k-1)*v[i],....a[j+l]);

這樣的數列還不能方便的計算

如果令b[j]=a[j]-j*v[i]  

那麼 dp[i+1][(j+k)*w[i]]=max+(j+k)*v[i];

b[j]這個數列就可以用滑動最小值的方法去維護了。

單調佇列優化多重揹包問題

樸素更新 for int i 0 i n i 由 f j max f j f j v w,f j 2 v 2 w,可以觀測到 f j f j v f j 2v f r r j v 是一類,即後面的j只會通過同類的前面元素遞迴過來 因此可以分成如下幾類 f 0 f v f 2v f kv f 1 f ...

單調佇列優化多重揹包

多重揹包的最原始的狀態轉移方程 令 c i min num i j v i f i j max f i 1 j k v i k w i 1 k c i 這裡的 k 是指取第 i 種物品 k 件。如果令 a j v i b j v i 那麼 j a v i b.這裡用 k 表示的意義改變,k 表示取第...

單調佇列優化多重揹包

多重揹包 n個物品,揹包承重m,每個物品 重量 wi 價值vi 個數為ci 普通多重揹包複雜度 o nmc for int i 1 i n i for int j 1 j m j for int k 1 k c i k w i j k f i j max f i j f i 1 j k w i k ...