动态规划(dynamic programming)与分治算法相似,都是通过组合子问题的解来求解原问题(在这里,“programming”指的是一种表格法,并非编写计算机程序)。分治方法将问题规划为互不相交的子问题,在将他们组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子问题(子问题的求解是递归进行的,将其划分为更小的子问题)。在这种情况下,分治算法会做许多不必要的工作,他会反复地求解那些公共子问题。而动态规划对每个子问题只求解一次,将其解保存在一个表格中,从而无需每次求解一个子问题时都重新计算,避免了这种不必要的计算工作。
动态规划之钢条切割问题:
问题描述:
假定我们知道sering公司出售一段长度为I英寸的钢条的价格为pi(i=1,2,3….)钢条长度为整英寸如图给出价格表的描述
长度i |
1 |
2 |
3 |
4 |
5 |
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
)