單調佇列優化多重揹包 洛谷P1776 寶物篩選

2022-03-11 13:59:02 字數 967 閱讀 9646

首先我們知道單調佇列,就是在區間移動時動態維護區間的最值

單調佇列優化的主要思想就是分組更新,因為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 using

namespace

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 ...