文章目录

  • 一、钢条切割定义
  • 二、具体步骤
  • 1.思考
  • 2.代码思考
  • 3.动态规划求解
  • 4.伪代码
  • 三:总结:

一、钢条切割定义

图为价格表
给定一段长度是n的钢条和一个价格表,求切割方案使得收益达到最大(允许全不切割的情况存在)

二、具体步骤

1.思考

易知长度为n的钢条有2的n-1次方种选择方式,故不可穷举。
我们可以考虑一段长度为n的钢条切段,在第k处时切开,如图:
这样的话,在n1段的前k-1上寻找最佳解,同理,在n2段的后m-k上寻找最佳解。这样的话问题就成为了:将两段钢条看成两个独立的钢条问题,我们称钢条切割问题满足最优子结构

还有另一种思路,采用更为简单的递归求解思想:

  1. 一段长度为i的不可分割的钢条
  2. 一段长度为n-i的混合钢条

2.代码思考

  1. 先看看第二种算法(简单易于理解)

    在这里采用自顶而下的递归算法,但这里的算法是失败的,问题在于它花费了大量时间来重复计算

拿长度为4来举例,规模为1的重复计算有4个,规模为0的重复计算有8个。
其时间复杂度为2的n次方

3.动态规划求解

  1. 带备忘的自顶而下法:之前算法慢的主要原因是因为大量重复运算,所以可以在过程中保留子问题的解(通常在数组或者散列表中),需要子问题的解时会首先检查是否保存从而节省了时间。
  2. 自底而上法:这个问题一般需要恰当的定义子问题规模,使得子问题求解依赖于更小的子问题求解,将子问题的规模按从小到大来排序求解,求解一个问题时是依赖更小问题的解,所以每个问题只要求解一次。

4.伪代码

  1. 自顶而下法:
  2. 自下而上法:

    算法复杂度为O(n平方)

三:总结:

时间复杂度都是n的平方,但是带备忘的自上而下法还是递归,自下而上则不是递归了。

算法导论-动态规划-钢条切割问题相关推荐

  1. 算法导论 动态规划钢条切割问题 C语言

    动态规划钢条切割问题 动态规划(dynamic programming)与分治法类似.分治策略将问题划分为互不相交的子问题,递归求解子问题,再将子问题进行组合,求解原问题.动态规划应用于子问题重叠的情 ...

  2. 动态规划 — 钢条切割问题

    动态规划: 什么是动态规划? 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求解任一子问题时 ...

  3. 算法导论-动态规划(钢条切割问题)

    写下文章来记录下自己学习算法导论的笔记 文章目录 写下文章来记录下自己学习算法导论的笔记 动态规划的目的 设计动态规划算法 钢条切割问题 问题描述 刻画问题结构(建立方程) 递归方程建立 带备忘录的自 ...

  4. 动态规划-钢条切割(java)

    数据结构与算法系列源代码:https://github.com/ThinerZQ/AllAlgorithmInJava 本文源代码:https://github.com/ThinerZQ/AllAlg ...

  5. 动态规划 -- 钢条切割问题

    给定一段长度为n英寸的钢条和一个价格表p,求切割钢条方案(钢条的长度均为整英寸),使得销售收益最大. 我们可以计算出长度为n英寸的钢条共有2的(n-1)次方种不同的切割方案. 为解决规模为n的原问题, ...

  6. 动态规划—钢条切割问题与01背包问题

    目录 1.钢条切割问题 第一种求最优解方案: 第二种求最优解方案: 第一种方法是 带备忘的自顶向下法 第二种方法是 自底向上法 2.01背包问题 1,穷举法(把所有情况列出来,比较得到 总价值最大的情 ...

  7. 算法导论例题——钢管切割

    <算法导论>(CLRS)中第一个dp例题(rodcutting)的C++代码 #include<iostream> #include<vector> #includ ...

  8. 算法导论动态规划切割钢条

    保存已经求得的子问题解 自底向上 #ifndef _MODEL_ #define _MODEL_ #include<vector> #include<map> using st ...

  9. 动态规划——钢条切割

    有一根钢条,和他的长度价格表,真么样切割才能使得售出的钢条收益最大. 不考虑钢条的切割损耗. 输入n 表示钢条的长度 价格表p[i] 表示长度为i的钢条出售的价格 ------------------ ...

最新文章

  1. 【OpenCV学习笔记2】OpenCV 完全安装 新增VS2010+OpenCV2.1,新增VS2010+OpenCV2.3.1
  2. Android socket 编程 实现消息推送(二)
  3. [050] 微信公众平台开发入门视频教程已公布
  4. linux 字符串string操作(截取、提取、长度计算等)
  5. 读人人都是产品经理__2
  6. 脸书推出VR视频会议应用程序 正式跨出元宇宙第一步;三家公司新入选福布斯2021云计算百强榜;微软挖来亚马逊云业务顶级高管贝尔...
  7. 处理对象(toString()方法详解和==与equals方法的区别)
  8. 机器学习基石作业二中的DECISION_STUMP实现
  9. python如何装sklearn_python安装sklearn
  10. linux /etc/profile文件,Linux 配置文件 /etc/profile
  11. vmware虚拟机里的LINUX不能上网的原因一:虚拟网卡设置
  12. Java怎么用继承回复信息_JAVA面向对象-继承
  13. html标签之常用标签
  14. Laravel5.4 导出Excel表格
  15. 停止MySQL正在执行的SQL语句
  16. 3点画矩形的lisp_在CAD中,如何在这个矩形里面再画三个这样的矩形
  17. 336亿的生意——你所不了解的Dapp这一年(下)
  18. 服装尺寸 html,国家标准服装尺寸表
  19. 高通量基因组测序中,什么是测序深度和覆盖度?
  20. JS语法之:require

热门文章

  1. 何谓光电传感器-看看基恩士如何说
  2. 文化产业新兴产物:游戏音乐外包
  3. 自适应网站(不用任何框架实现)
  4. 丶为什么人们总是在失去之后才懂得珍惜..
  5. RGBYUV图像视频格式
  6. spoolsv.exe 报错,无法打印
  7. 基于S3C2410平台移植Linux 2.6内核指南
  8. 【超详细Python秒杀代码】京东淘宝抢购通用
  9. demonstration记忆_雅思分类词汇背诵记忆:教育2
  10. 四级作文常用连接词总结