钢条切割

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

相关文章
相关标签/搜索