动态规划(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)