多重揹包 單調佇列DP oj1943

2022-06-02 04:18:12 字數 760 閱讀 1738

題目大意:

em.... 就是多重揹包

挑戰340頁的東西 ...自己的筆記總結總是比較亂的

重點:原始的狀態轉移方程中 更新第 i 種物品時重量%w[i]的值不同 則它們之間是相互獨立的;

1--- 就是說在考慮第 i 種物品拿幾個時,w[i]+1 與 2*w[i]+1 與...與 k*w[i]+1 相互之間是有關聯的

但 w[i]+j ... k*w[i]+j (j不為1) 與 w[i]+1 是相互獨立 無關的,即%w[i]的值不同時 相互獨立

2--- 那麼可以將 w[i]+j 與 2*w[i]+j 與...與 k*w[i]+j 的最優解都壓在 j 中,因為只要知道 j 的最優解

並且知道 k(個數),就知道 k*w[i]+j的最優解 = j的最優解 + k*v[i]

用雙端佇列維護不同餘數 j 的最優解,採用題目 滑動最小值 的方法維護 m[i]個物品在不同重量區間 的最大值

#include using

namespace

std;

int n,w,w[10005],v[10005],m[10005],dp[10005

];int deq[10005],deqv[10005]; //

模擬deque deq儲存下標 deqv儲存值

intmain()

}printf(

"%d\n

",dp[w]);}}

return0;

}

view code

單調佇列優化多重揹包

多重揹包的最原始的狀態轉移方程 令 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 ...

單調佇列優化多重揹包

應該是個經典演算法,稍微記錄一下 用 w i 表示重量,v i 表示價值 那麼不難寫出轉移方程 f i j max f i 1 j k w i k v i 考慮用單調佇列優化。我們若要用單調佇列優化,那麼必須滿足轉移時所需要的狀態只與 k 有關 這裡要用到乙個神仙操作,對 j w i 分類 因為對於...