首先我們知道單調佇列,就是在區間移動時動態維護區間的最值
單調佇列優化的主要思想就是分組更新,因為w[i] w[i]w[i]是成倍增加的
對於當前為w的體積,我們可以按它的餘數分w組,即0,1....w-1
同乙個餘數的在一組
每組的轉移是不影響的,也就是說單獨轉移
f[i][5w]=max(f[i−1][4w]−4v,f[i−1][3w]−3v,f[i−1][2w]−2v,f[i−1][w]−v,f[i−1][0])
f[i][4w]=max(f[i−1][3w]−3v,f[i−1][2w]−2v,f[i−1][w]−v,f[i−1][0])
如上所示,每乙個都可能有其組內前幾個更新來,且不確定是哪個更新的,所以就可以用單調佇列優化啦,維護區間的最大值。區間長度就是物品的個數num
原來的狀態轉移方程為:f[i][j]=max(f[i−1][j],f[i−1][j−k∗w[i]]+k∗v[i])
現在的狀態轉移方程為:f[i][j]=max(f[i-1][d+j*w]-j*v,f[i-1][j])+a*v.(a=w/w)
即原方程減的越少,等價於現在這個方程加的越多,所以區間可以從頭移動到尾。(原方程選擇數目是從左開始,對應現方程就是從右開始)
看的幾篇部落格:揹包九講詳解版
#include usingnamespace
std;
typedef
long
long
ll;const
int mod=1e9+7
;const
int inf=1
<<30
;const
int maxn=4e4+7
;int
dp[maxn],q[maxn],p[maxn];
intmain() }}
cout
return0;
}
多重揹包單調佇列優化思路 單調佇列優化多重揹包問題
6.多重揹包問題 iii acwing題庫 www.acwing.com 揹包九講bilibili www.bilibili.com 從公式中可以看出f j 和f j c 都是從s 1個數裡面取最大值,計算f j c 時只是將滑動視窗右移了一步,類似下圖的效果 只不過移動的時候,前面的s個元素都增加...
單調佇列優化多重揹包
多重揹包的最原始的狀態轉移方程 令 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 ...