钢条切割

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

原文地址:https://www.cnblogs.com/bridger/p/4439612.html