zoukankan      html  css  js  c++  java
  • 钢条切割

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

  • 相关阅读:
    ASP与sql存储过程
    SharpWebMail介绍和安装(转)
    安全编程: 验证输入
    【转】 数据库备份与还原处理
    权限管理设计、分析、实现参考资料
    权限设计
    提高查询速度方法总结
    乱七八糟知识点
    阿里分布式事务框架Seata原理解析
    分布式事务
  • 原文地址:https://www.cnblogs.com/bridger/p/4439612.html
Copyright © 2011-2022 走看看