單調佇列優化多重揹包

2022-04-30 02:57:08 字數 873 閱讀 2058

應該是個經典演算法,稍微記錄一下

用\(w[i]\)表示重量,\(v[i]\)表示價值

那麼不難寫出轉移方程

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

考慮用單調佇列優化。

我們若要用單調佇列優化,那麼必須滿足轉移時所需要的狀態只與\(k\)有關

這裡要用到乙個神仙操作,對\(j \% w[i]\)分類

因為對於\(\% j\)後相同的數,轉移時只有\(k\)的值不相同。

設\(a = \frac, b = j \% w[i]\)

那麼轉移方程可以寫成

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

對每個\(j \% w[i]\)分別維護單調佇列即可。。

同時\(f\)陣列可以滾動一下

題目鏈結

#include#define ll long long 

using namespace std;

const int maxn = 1001;

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}int n, m, c, q[10001];

ll f[10001], val[10001];

main() }}

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

cout << f[c];

return 0;

}

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

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