算法八——动态规划
1 0-1背包問題
背包能夠承受的總重量一定w,每個物品的總量不同int[] weight表示。怎么放才能讓背包中物品的總重量最大。
每次決定一種物品,每一層能夠達到的狀態 state[][]
第0個物品的重量是2,要么裝入背包,要么不裝入背包,決策之后會對應背包中的兩種狀態,背包中的總總量是0或者2.我們用state[0][0]=true,state[0][2]=true來表示這兩種狀態。
第1個物品的重量是2,要么裝入背包,要么不裝入背包,決策之后對應的背包狀態:
0+0=0
0+2=2
2+2=4
這是基于上一步背包的狀態計算得到的
我們用state[1][0]=true state[1][2]=true state[1][4]=true 來表示。
以此類推,一直到第n-1個物品。找到state[n-1] 的 數組中找到最大的state[n-1][j]=true,返回j。
2 判斷一個問題是否可以用動態規劃
1 是否符合一個模型?
從(0,0)走到(n-1,n-1),總共要走2*(n-1)步,也就對應著2*(n-1)個階段。每個階段都有向下走或者向右走兩種策略,并且每個階段都會對應一個狀態集合。
我們把狀態定義為min_dist(i,j),其中i表示行,j表示列,min_dist表達式的值表示從(0,0)到(i,j)的最短路徑長度。
所以這個問題是一個多階段決策最優解問題,符合動態規劃的模型。
2 重復子問題?
這個問題可以用回溯法解決。從(0,0)到當前位置,有多種路線,也就說明問題存在重復子問題。
3 無后效性?
我們僅僅允許往下和往右移動,不允許后退,所以前面階段的狀態確定之后,不會被后面階段的決策所改變,所以這個問題符合無后效性。
4 最優子結構
根據題目要求的走法,要想到達(i,j),必須通過(i-1,j)或者(i-,j-1)這兩個節點到達。也就是說min_dist(i,j) 可以通過min_dist(i, j-1) 和 min_dist(i-1,j)推導出來。
這說明,這個問題符合最優子結構。
3 動態規劃解決方法
3.1 狀態轉移表法
3.2 狀態轉移方程法
總結
- 上一篇: 慎用SELECT INTO复制表
- 下一篇: 【数据结构与算法】散列表