一、题目

钢条切割问题 是《算法导论》一书中介绍动态规划时的一道引题。即:

某公司购买长钢条,将其切割为短钢条出售。假设切割工序没有成本支出,已知长度为 i 的钢条出售价格为 pi ,钢条长度均为整数,公司管理希望知道最佳的切割方案。

价格表样例:

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

现给定长钢条的长度 n ,以及长度 i 的钢条售价为 pi,求钢条切割方案,使得收益最大。


二、分析

首先最容易想到的一种解法就是,将长度为 n 的钢条的切割方案全部罗列出来,然后取出其中一个收益最大的方案返回。

但是,对于长度为 n 的钢条,将会有 2n-1 种不同的切割方案,在 n 较大时,方案的数量级将急剧增大。因此我们需要考虑使用一种更好的策略来解决这个问题。

动态规划 是典型的使用空间换取时间的一种方法,通过先求解子问题,最终解决问题。

例如,我们先求解出长度为 1 时的最优解,并将结果保存起来;再求解长度为 2 时的最优解,并将结果保存起来;……;最终求得长度为 n 时的最优解返回。在求解长度为 i 时的最优解时,我们需要依次比较长度为 k(1<k<i) 的最优解加上长度为 i-k 的最优解的和,最终选择一个最大值作为长度为 i 时的最优解并保存起来。
最终进行到 n 时,由于前面的最优解都已经得到了,所以我们也很容易得到 n 时的最优解。


三、解答

public class Main {public static void main(String[] args) {int[] p = new int[] { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 }; // 长度为数组索引值,所对应的价值int[][] result = cutRob(p, 10);System.out.print("i:\t");for (int i = 0; i <= 10; i++) {System.out.print(i + "\t");}System.out.print("\nr[i]:\t");for (int i = 0; i < result[0].length; i++) {System.out.print(result[0][i] + "\t");}System.out.print("\ns[i]:\t");for (int i = 0; i < result[0].length; i++) {System.out.print(result[1][i] + "\t");}     }public static int[][] cutRob(int[] p, int n) {// result[0] 用来存储不同长度 n 时的最大价值// result[1] 用来存储不同长度 n 时的最大价值方案,第一段切割的长度int[][] result = new int[2][n + 1];for (int i = 1; i <= n; i++) {int max = Integer.MIN_VALUE;int index = 1;while (index <= i && index < p.length) {int current = p[index] + result[0][i - index];if (current > max) {max = current;result[1][i] = index;}index++;}result[0][i] = max;}return result;}}

执行结果:

我们使用 i 表示钢条的长度,用 r[i] 表示长度为 i 的钢条对应的最大价值,用 s[i] 表示最大价值的方案,切割的第一段钢条的长度,那么结果为

i 0 1 2 3 4 5 6 7 8 9 10
r[i] 0 1 5 8 10 13 17 18 22 25 30
s[i] 0 1 2 3 2 2 6 1 2 3 10

这里可以看到,假设长度为 9 的钢条的最佳切割方案即是:
第一段切割长度 3,价值 8;切割后长度为 6,切割长度还是 6,价值为 17。最终切割方案为一段 3,一段 6,最大价值为 8 + 17 = 25。

动态规划:钢条切割问题相关推荐

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

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

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

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

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

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

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

    文章目录 一.钢条切割定义 二.具体步骤 1.思考 2.代码思考 3.动态规划求解 4.伪代码 三:总结: 一.钢条切割定义 图为价格表 给定一段长度是n的钢条和一个价格表,求切割方案使得收益达到最大 ...

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

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

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

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

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

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

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

    int BottomUpCutRod(int p[],int n) { int *r=new int[n+1]; r[0]=0; for (int j=1;j<=n;j++) { int q=- ...

  9. 《算法导论》中动态规划求解钢条切割问题

    动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契 ...

  10. 钢条分割 动态规划java_【动态规划】初识,钢条切割问题

    正文之前其实动态规划老早之前就看过, 但是可惜的是印象不深,到今天彻底忘得差不多了,这两天看<算法导论>终于让我啃下了二叉搜索树和红黑树两个家伙,虽然还未曾熟练于胸,但是基本能用了...现 ...

最新文章

  1. CSR稀疏矩阵存储方式
  2. 第一课.python入门与环境介绍
  3. AI A_star算法野人渡河-实验报告
  4. iframe内联元素有白边原因_Selenium无法定位元素的几种解决方案
  5. windows RabbitMq 安装
  6. 2008一打开项目就闪退_UE4[C++]项目编译相关的坑
  7. POJ 1095 Trees Made to Order
  8. 新浪微博客户端(27)-格式化工具条显示数字
  9. 微信小程序一笔记账开发进度五
  10. U盘插入电脑无反应,坏了?不存在的
  11. python3标识符_python3学习笔记一(标识符、关键字)
  12. 百度人脸识别技术应用002---百度云上创建人脸库_分组_以及通过网页上传人脸照片到人脸分组
  13. 计算机组成原理-计算机硬件的基本组成
  14. 优质的游戏音效推荐,不容错过
  15. 德语翻译-德语在线批量翻译软件
  16. 【论文阅读】基于深度神经网络的人体运动姿态估计与识别
  17. runtime error解决方法
  18. oppo手机的屏幕常亮问题
  19. OLED TFT屏幕相关
  20. IE标签页去掉东方头条什么的垃圾信息

热门文章

  1. hudi概念与设计介绍
  2. 原神换服报错(二级地址解析失败),换服失败,无反应
  3. [无线玩家]玩转无线路由之DD-WRT基础扫盲
  4. [转载]ExtJS中grid按照中文拼音首字母排序、改变行背景、列背景、静态数据分页不再困难...
  5. 迅捷OCR文字识别软件的功能介绍
  6. 山石防火墙--飞塔防火墙间GRE配置
  7. 当拓普遇上SAP,展翅翱翔的雄鹰飞向了更高的天空
  8. 细胞亚器文献阅读二~An ER-Mitochondria Tethering Complex Revealed by a Synthetic Biology Screen
  9. python错误警告 PEP8 W605 invalid escape sequence ‘\.‘
  10. 投资 - 指标介绍: MACD