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