應該是個經典演算法,稍微記錄一下
用\(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 ...