动态规划:钢条切割问题
一、题目
钢条切割问题 是《算法导论》一书中介绍动态规划时的一道引题。即:
某公司购买长钢条,将其切割为短钢条出售。假设切割工序没有成本支出,已知长度为 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。
动态规划:钢条切割问题相关推荐
- 动态规划 — 钢条切割问题
动态规划: 什么是动态规划? 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求解任一子问题时 ...
- 算法导论 动态规划钢条切割问题 C语言
动态规划钢条切割问题 动态规划(dynamic programming)与分治法类似.分治策略将问题划分为互不相交的子问题,递归求解子问题,再将子问题进行组合,求解原问题.动态规划应用于子问题重叠的情 ...
- 动态规划—钢条切割问题与01背包问题
目录 1.钢条切割问题 第一种求最优解方案: 第二种求最优解方案: 第一种方法是 带备忘的自顶向下法 第二种方法是 自底向上法 2.01背包问题 1,穷举法(把所有情况列出来,比较得到 总价值最大的情 ...
- 算法导论-动态规划-钢条切割问题
文章目录 一.钢条切割定义 二.具体步骤 1.思考 2.代码思考 3.动态规划求解 4.伪代码 三:总结: 一.钢条切割定义 图为价格表 给定一段长度是n的钢条和一个价格表,求切割方案使得收益达到最大 ...
- 动态规划-钢条切割(java)
数据结构与算法系列源代码:https://github.com/ThinerZQ/AllAlgorithmInJava 本文源代码:https://github.com/ThinerZQ/AllAlg ...
- 动态规划 -- 钢条切割问题
给定一段长度为n英寸的钢条和一个价格表p,求切割钢条方案(钢条的长度均为整英寸),使得销售收益最大. 我们可以计算出长度为n英寸的钢条共有2的(n-1)次方种不同的切割方案. 为解决规模为n的原问题, ...
- 动态规划——钢条切割
有一根钢条,和他的长度价格表,真么样切割才能使得售出的钢条收益最大. 不考虑钢条的切割损耗. 输入n 表示钢条的长度 价格表p[i] 表示长度为i的钢条出售的价格 ------------------ ...
- 动态规划-钢条切割问题
int BottomUpCutRod(int p[],int n) { int *r=new int[n+1]; r[0]=0; for (int j=1;j<=n;j++) { int q=- ...
- 《算法导论》中动态规划求解钢条切割问题
动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契 ...
- 钢条分割 动态规划java_【动态规划】初识,钢条切割问题
正文之前其实动态规划老早之前就看过, 但是可惜的是印象不深,到今天彻底忘得差不多了,这两天看<算法导论>终于让我啃下了二叉搜索树和红黑树两个家伙,虽然还未曾熟练于胸,但是基本能用了...现 ...
最新文章
- CSR稀疏矩阵存储方式
- 第一课.python入门与环境介绍
- AI A_star算法野人渡河-实验报告
- iframe内联元素有白边原因_Selenium无法定位元素的几种解决方案
- windows RabbitMq 安装
- 2008一打开项目就闪退_UE4[C++]项目编译相关的坑
- POJ 1095 Trees Made to Order
- 新浪微博客户端(27)-格式化工具条显示数字
- 微信小程序一笔记账开发进度五
- U盘插入电脑无反应,坏了?不存在的
- python3标识符_python3学习笔记一(标识符、关键字)
- 百度人脸识别技术应用002---百度云上创建人脸库_分组_以及通过网页上传人脸照片到人脸分组
- 计算机组成原理-计算机硬件的基本组成
- 优质的游戏音效推荐,不容错过
- 德语翻译-德语在线批量翻译软件
- 【论文阅读】基于深度神经网络的人体运动姿态估计与识别
- runtime error解决方法
- oppo手机的屏幕常亮问题
- OLED TFT屏幕相关
- IE标签页去掉东方头条什么的垃圾信息
热门文章
- hudi概念与设计介绍
- 原神换服报错(二级地址解析失败),换服失败,无反应
- [无线玩家]玩转无线路由之DD-WRT基础扫盲
- [转载]ExtJS中grid按照中文拼音首字母排序、改变行背景、列背景、静态数据分页不再困难...
- 迅捷OCR文字识别软件的功能介绍
- 山石防火墙--飞塔防火墙间GRE配置
- 当拓普遇上SAP,展翅翱翔的雄鹰飞向了更高的天空
- 细胞亚器文献阅读二~An ER-Mitochondria Tethering Complex Revealed by a Synthetic Biology Screen
- python错误警告 PEP8 W605 invalid escape sequence ‘\.‘
- 投资 - 指标介绍: MACD