第二講 完全揹包問題 對揹包九講的學習

2022-07-03 15:48:20 字數 1094 閱讀 9837

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

完全揹包和01揹包的區別是乙個物品可以被拿無限次,我們之前01揹包是拿或者不拿的max,比較,然後我們處理完全揹包的時候每個物品拿多少次就好了

每個物品最優拿法=max(不拿,拿乙個,拿兩個,...,拿n個),丟擲個問題,n難道是無限嗎?顯然不是,大前提是揹包總空間或者說處理到第i個物品時剩餘空間有限

如果說當前空間最多只能拿n個,那我們的max函式就比較到這個物品拿n個時候就好了

這樣一來,無限的問題被我們用揹包總空間的限制條件處理成了乙個動態的有限問題

其實也算是完全揹包轉多重揹包

這樣來就有了第乙個遞推式

開始前可以來一次時間複雜度為o(n^2)的優化,就是假如有物品a,b

a比b占用空間多並且比b價值少,那我們可以直接排除掉不划算的物品a

對於隨機生成的資料,這樣子還是可以優化一部分的

乙個物品最多可以拿v/c[i]次,這一步把問題由完全揹包轉移到了多重揹包

下面貼一張我自己寫的文字的截圖

使用了滾動陣列,並且只是01揹包**的修改而已

回想一下我們學01揹包滾動陣列版本的時候,是不是要求陣列第二維的j一定要從後往前,從大到小來遍歷,就是為了防止新資料被新資料覆蓋

我們只允許舊資料被新資料覆蓋(拿一次還是不拿),那麼新資料被新資料覆蓋在實際層面怎麼理解呢,就是(拿j次還是拿j-1次)

所以接下來我們在01揹包**的基礎上讓第二維的j從小到大,從前往後

如果說新資料覆蓋新資料更好,那麼我就給你覆蓋,也就是如果已經拿了幾個這種物品了,如果再拿幾個會更好,那我就給你拿

for(ll i=1;i<=n;i++)

for(ll j=c[i];j<=v;j++)

感謝老師教的這種層面理解方法,通俗易懂

動態規劃第二講 完全揹包與多重揹包問題

上一節,我們討論了01揹包問題,說明了 遞迴與分治法 與 動態規劃dp的區別和聯絡,介紹了快取的概念 以下,我們用dc dp cache分別表示分治法 動態規劃和快取。本節,我們討論01揹包的另外兩種形似 完全揹包和多重揹包問題,分析dp問題的另外一些情況。同樣有n種價值和重量分別為weight i...

揹包九講之 完全揹包

完全揹包與01揹包的區別在於完全揹包第i件物品可以在允許範圍內選無數個,同樣的v i 表示體積,w i 表示價值。同樣的,我們先從二維入手,較為顯而易見。dp i j 表示前i件物品在容量為j的最大價值,那麼相應的也會出現很多情況 1.不選 dp i j dp i 1 j 2.選一件 dp i j ...

讀揹包九講之二 完全揹包

沒想到完全揹包還有如此神奇的寫法。學習了。還了解了和快速求冪類似的二進位制思想。對於為什麼完全揹包能夠這樣直接從s i 1 到v遍歷可行並且必須這樣,可以從兩個層面理解。一是從抽象的概念角度,也就是文章裡所說的,對於狀態dp j 由於可能多次取到同乙個物品,所以從已經遍歷的方向向未遍歷的方向遍歷是正...