動態規劃問題是學習算法時一個尤其重要的內容,在講解什麼是動態規劃以前,首先來說一下分而治之。算法
分而治之就是一個大問題能夠被分解成許多個小問題,逐個解決最後合併便可。歸併排序就是使用的分而治之,時間複雜度爲O(n*logn),空間複雜度O(n)。可是咱們在使用歸併排序時,每一個子問題都是隻被計算一次,可是若是每一個子問題不相互獨立,須要被重複計算好屢次,分而治之就再也不是明智的選擇了,徹底能夠把子問題的結果放在一個表中,須要就直接去查便可,這種存放子問題結果的方式就是所謂的動態規劃。微信
動態規劃能夠解決各類問題,好比矩陣連乘(最小連乘次數),最長公共子序列,01揹包……機器學習
今天咱們用動態規劃解決三維01揹包問題,在解決三維01揹包以前,簡單的講一下01揹包問題:有一個揹包,最大載重W,有n個物品,每一個物品重量爲w[i],價值爲v[i],1 <= i <= n,i是整數。裝入哪些物品才能使裝入物品的總價值最大?下面給出01揹包問題的動態規劃解決思路,代碼就不實現了,由於今天要解決的問題不是這個,可是今天要解決的問題是創建在這個問題的基礎上。學習
階段:在前N件物品中,選取若干件物品放入揹包中;spa
狀態:在前N件物品中,選取若干件物品放入所剩空間爲W的揹包中的所能得到的最大價值;.net
決策:第N件物品放或者不放;blog
由此能夠寫出動態轉移方程:排序
咱們用f[i, j]表示在前i件物品中選擇若干件放在所剩空間爲j的揹包裏所能得到的最大價值get
f[i, j] = max{f[i-1, j-w[i]]+v[i](j >= Wi), f[i-1, j]}it
這樣,咱們能夠自底向上地得出在前N件物品中取出若干件放進揹包能得到的最大價值。
在這個問題中,僅僅只有一個限制條件,也就是最大載重,但是有些時候揹包並不僅是載重受限,體積也會受限,當01揹包問題有兩個限制條件:載重和體積,這樣01揹包問題就變成了三維01揹包問題。(這是我上網查的三維01揹包問題的定義,不知道對不對,敬請諒解)一樣的也能夠寫出動態轉移方程:f[i, j, k] = max{f[i-1, j-w[i], k-V[i]]+v[i](j >= w[i], k >= V[i]), f[i-1, j, k]},V[i]表示第i個物品的體積,k表示剩餘體積。
下面來看一下代碼的實現和運行結果,爲了方便你們理解,作了一些輸出而且代碼中有註釋。
若是你們想知道具體的規劃過程,解開上面代碼的多行註釋而後運行便可。
今天的文章有不懂的能夠加羣,羣號:822163725,備註:小陳學Python,不備註但是會被拒絕的哦~!
最後歡迎你們掃碼關注
本文分享自微信公衆號 - Python機器學習算法說書人(Python-ML-Algorithm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。