動態規劃是解決變成問題的一種重要思想,而揹包則是動態規劃的一種。
揹包問題:給你乙個容量為v的揹包以及一些具有價值wi和體積vi的一些物品,要你求出揹包所能裝的最大價值。
解決方法:
定義乙個陣列f[i][v]用來統計各種情況下,揹包所能裝的最大價值,其中,i代表當前只提供前i個物品給你選擇,v表示當前只提供v體積給你裝物品
具體**實現:
//關鍵思想方程:f[i][j]=max 判斷裝入和不裝入,哪個價值更大
f[n][v];//假設有n個物品,v的容量
for(int i=1;i
因為最後要的最值肯定是要把所有物品都考慮的情況下的最大值,那麼有沒有可能建立乙個儲存最值用的陣列下標只和體積有關呢?
答案是肯定的,方法很簡單,大體思路沒變,主迴圈依舊是遍歷物品(逐步把所有物品考慮進去),只是對容量的迴圈改為遞減,原因見**:
f[v];//儲存陣列改為只和容量有關
//關鍵思想方程:f[j]=max,與f[i][j]=max不難看出,要想通過一位陣列實現,那麼max裡的f[j],f[j-vi]必須是不考慮第i個物品時的值,同樣是判斷
//裝入和不裝入,哪個價值更大,不過在這裡就可以看出為什麼容量的迴圈是遞減的,思考一下,如果容量遞減,那麼f[j]的修改是根據j從大到小的修改的,這時max裡的f[j],f[j-vi]是沒修改過的,也
//就是說這兩個值是還沒考慮第i個時的值,這是我們要的,如果是遞增的,那麼f[j]和f[j-vi]都是修改過的,也就是已經考慮過第i個物品的值,不滿足要求
for(int i=1;i=vi;j--)//注意:這裡不能遞減到0,因為下面有j-vi
01揹包初步理解,及其優化
第一部分 01揹包初步理解 剛開始學01揹包一頭霧水,聽不明白,但慢慢的隨著查資料,刷題,逐漸得到了一些關鍵的知識點,才有點頓開的感覺。1 動態方程 dp i j max dp i 1 j w i c i dp i 1 j 我逐漸理解到這個方程為什麼要這麼寫是從j w i 開始的。2 j代表揹包容積...
01揹包 優化之前,之後
塗奧最近迷上了吃雞,房間有n個配件,每個配件有c c 1e3 的重量和v v 1e3 的價值,哇,塗奧撿了乙個2級包,容量為s,所以塗奧最多當多肥的快遞員呢?input 輸入的第一行是t,表示有一共要打t場比賽.每組資料由三行組成.第1行包含兩個整數n和s 第2行包含n個整數,表示每乙個配件的價值....
Music Problem 01揹包優化
一道很不錯的題目,綜合了多個知識點。題意 給你n個數,判斷能否在這n個數中選一些數組成3600的倍數。先給這個題的一般形式。給你n個數,判斷能否在這n個數中選一些數組成m的倍數。1 n 1e6,2 m 1e3 然後我們可以發現乙個01揹包的解法 時間複雜度 o n m 狀態 dp i j 表示從1到...