鋼條切割

動態規劃(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)

相關文章
相關標籤/搜索