這節是總結和類比,如果看着比較籠統,請先自己編碼實作完全背包和01背包代碼,參考:
算法.動态規劃.完全背包問題 (Java,遞歸)_要錢也要自我實作-CSDN部落格01背包問題 錢币最少
https://blog.csdn.net/weixin_42754896/article/details/123068850?spm=1001.2014.3001.5501算法.動态規劃.完全背包問題 (Java,遞歸)_要錢也要自我實作-CSDN部落格01背包問題 錢币最少
https://blog.csdn.net/weixin_42754896/article/details/123068850?spm=1001.2014.3001.5501
什麼是背包問題
有這麼一個包包,要裝最大價值的東西,重量需要在包包的承受範圍内
動态規劃
動态規劃是解決背包問題的思路: F(n) = F(n-1) + K
第一步有N中選擇,周遊這N中選擇,選一個最優的解
類比
東西編号 : D1 D2 D3 D4
體積W : 2 3 4 5
價值V : 3 4 5 6
東西個數:
完全背包: ∞ ∞ ∞ ∞
01背包 : 1 1 1 1
多重背包: n1 n2 n3 n4
多元背包: W1 W2 W3 W4 (重量,體積+重量限制)
恰好裝滿: 最後剩餘體積必須 =0 才可以
背包體積W:8
1. 01背包/多重背包 = 完全背包 + 東西個數限制
2. 多元背包: 多元控制條件,比如:體積,重量 同時限制 背包可以拿多少東西。
3. 多重背包 = N * D1 可以化解為 :01背包=D1 D1 D1 …… (N個)
4. 恰好裝滿: 體積最後需要剩餘為0才可以,這種也可以在湊錢中限制,湊100塊就必須湊夠,否則少給你你也不幹呀。
實作對比
1. 最容易了解的實作是 疊代
2. 如果東西太多疊代代價太大, 可以轉為循環實作,但思想不變
參考文檔
動态規劃之背包問題系列 - 知乎
【算法總結】動态規劃-背包問題 - 郭怡柔 - 部落格園
什麼是動态規劃(Dynamic Programming)?動态規劃的意義是什麼? - 知乎