这道题在算法导论(第三版)的204页

钢条切割问题是这样的:

给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,...,n),求切割钢条方案,使得销售收益rn最大。注意,如果长度为n英寸的钢条的价格pn足够大,最优解可能就是完全不需要切割。

假设有一张价格表为:

价格表
长度i 1 2 3 4 5 6 7 8 9 10
价格pi 1 5 8 9 10 17 17 20 24 30

基本思路:我们将钢条从左边切割下长度为i的一段,只对右边剩下的长度为n-i的一段继续进行切割(递归求解),对左边的一段则不再进行切割。则可得公式:

其中pi为左边长度为i的钢条的收益,rn-i为右边长度为n-i的钢条继续切割后得到的最优收益,rn为长度为n的钢条切割后得到的最优收益。

递归实现代码如下:

package dynamic;/** 钢条切割  算法导论P204*/
public class Steel {/*** 比较大小* @param a* @param b* @return*/public static int max(int a, int b) {return (a > b ? a : b);}/*** * @param p 存储价格的数组,p从0开始存储* @param n 钢条长度为n* @return 返回长度为n的钢条切割后得到的最大收益*/public static int cut(int[] p,int n){//如果长度为0,则0收益if(n==0)return 0;int q = -1;// 思路://将长度为n的钢条从左切割长度为i的一段,则右端为长度为n-i的一段//其中长度为i的左端不继续切割,只继续切割右端的那一部分//一直递归的cut(p,n-i)最后得到的是长度为n-i的钢条切割后的最大收益for(int i = 0; i < n; i++) {q = max(q,p[i] + cut(p,n-i-1)); //切割后的收益和不切割}return q;}public static void main(String[] args) {int[] p = {1,5,8,9,10,17,17,20,24,30};int n = 4;System.out.println(cut(p,n));}}

因为这道题是用递归实现的,所以必然存在一个缺点,那就是当数据n很大时,方法cut会反复调用相同的参数值对自身进行递归调用,即它反复求解相同的子问题。这会导致cut方法运行时间为n的指数函数。效率很低!

所以我们需要进行优化,可以使用动态规划法来求解最优钢条切割问题。

如何利用动态规划法来求解最优钢条切割问题请见下文。

钢条切割问题——递归求解法相关推荐

  1. 八皇后问题 递归求解法

    #include <iostream> #include <fstream> #include <string.h>/** 八皇后问题递归方法实现 */ using ...

  2. 递归实现钢条切割问题(Java版)

    钢条切割问题递归有两种思想: 1.切割一刀分别获取两两边的最优解相加,获取两两相加的最优解和不切割的比较这样就可以得出可以分割的最大价值. 公式:r(n)=max(p[n] , r(1)+r(n-1) ...

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

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

  4. 钢条切割(记忆型递归)dp

    题目: Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2 ...

  5. 钢条切割(dp解法)

    1. 问题描述: Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi( ...

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

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

  7. 数据结构(python) —— 【34: 动态规划之钢条切割问题】

    钢条切割问题 1. 问题 某公司出售钢条,出售价格与钢条长度之间的关系如下表: 问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大. 2. 思路 思考: 长度为n的钢条的不同切 ...

  8. 算法导论中的钢条切割问题

    问题描述:   公司购买长钢条,将其切割为短钢条进行出售,切割工序本身没有成本支出,公式管理层希望知道最佳的切割方案.假定我们知道公司出售一段长为i英寸的钢条价格为pi:钢条的长度均为整英寸.给定一段 ...

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

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

最新文章

  1. 盘点2018年计算机视觉领域技术突破
  2. EM上的按钮是方框的问题
  3. 海量存储之十八–一致性和高可用专题
  4. 在线流程图绘制网站draw.io支持的三种存储介质
  5. MySql某一列累计查询
  6. 计算机体系结构数据库论文,信息管理中计算机数据库系统研究论文
  7. Grid使用 ComboBox Binding DateTime Format WPF
  8. 宣布正式发布 Azure 媒体服务内容保护服务
  9. VS2005项目打开出错的解决办法
  10. 【matlab选题推荐三】基于MATLAB的答题卡自动阅卷记分系统
  11. 140个电脑小知识、小技巧
  12. 什么情况下你会毫不犹豫地辞职?
  13. @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解
  14. 粒子效果动画使用总结
  15. swag_ios安卓 testlight /apps/android官方开发包安装
  16. Openlayers前端复用Turf.js生成平头Buffer
  17. Voyager的Roles和Pemissions
  18. 习题11-8 单链表结点删除(没看懂我撤硕大口吃翔)
  19. 最新黑客网站(包含国内国外)
  20. echarts5.0引入地图,背景渐变色,航线图,地图阴影

热门文章

  1. python爬取当当网的书籍信息并保存到csv文件
  2. BootstrapSelect实现加载默认选中
  3. Http请求状态码-206
  4. 全开源的ROS2SLAM机器人 ROSBOT ROS2 open source SLAM robot
  5. APP的盈利模式是什么样的?一个免费APP怎么赚钱?
  6. 需要提升权限才能运行dism?
  7. ***大论文中插入Visio不失真方法:word插入viso图片方法
  8. vue数据穿梭框自定义排序
  9. Unity Shader - Shader常用属性标签(材质属性面板标签)
  10. svn的使用-拉代码-提交代码