動態規劃(dynamic programming)與分治算法類似,都是經過組合子問題的解來求解原問題(在這裏,「programming」指的是一種表格法,並不是編寫計算機程序)。分治方法將問題規劃爲互不相交的子問題,在將他們組合起來,求出原問題的解。與之相反,動態規劃應用於子問題重疊的狀況,即不一樣的子問題具備公共的子問題(子問題的求解是遞歸進行的,將其劃分爲更小的子問題)。在這種狀況下,分治算法會作許多沒必要要的工做,他會反覆地求解那些公共子問題。而動態規劃對每一個子問題只求解一次,將其解保存在一個表格中,從而無需每次求解一個子問題時都從新計算,避免了這種沒必要要的計算工做。php
動態規劃之鋼條切割問題:算法
問題描述:優化
假定咱們知道sering公司出售一段長度爲I英寸的鋼條的價格爲pi(i=1,2,3….)鋼條長度爲整英寸如圖給出價格表的描述spa
長度icode |
1blog |
2遞歸 |
3ci |
4io |
5table |
6 |
7 |
8 |
9 |
價格p[i] |
1 |
5 |
8 |
9 |
10 |
17 |
17 |
20 |
24
|
若鋼條的長度爲i,則鋼條的價格爲Pi,如何對給定長度的鋼條進行切割能獲得最大收益?
鋼條切割算法簡單實現,歡迎交流。
1 <?php 2 $p = array( 3 1 => 1, 4 2 => 5, 5 3 => 8, 6 4 => 9, 7 5 => 10, 8 6 => 17, 9 7 => 17, 10 8 => 20, 11 9 => 24, 12 10=> 30 13 ); 14 15 cutRod($p, 10); 16 function cutRod($p, $n) 17 { 18 $r[0] = 0; 19 20 for ($j=1; $j<=$n; $j++) 21 { 22 $q = -1; 23 for ($i=1; $i<=$j; $i++) 24 { 25 if ($q < $p[$i] + $r[$j-$i] ) 26 { 27 $q = $p[$i] + $r[$j-$i]; 28 $s[$j] = $i; 29 } 30 } 31 $r[$j] = $q; 32 } 33 print_r($s); 34 print_r($r); //最優化結果 35 } 36 37 ?>
結果以下:
Array( [1] => 1 [2] => 2 [3] => 3 [4] => 2 [5] => 2 [6] => 6 [7] => 1 [8] => 2 [9] => 3 [10] => 10)Array( [0] => 0 [1] => 1 [2] => 5 [3] => 8 [4] => 10 [5] => 13 [6] => 17 [7] => 18 [8] => 22 [9] => 25 [10] => 30)