钢条切割问题(动态规划)
钢条切割问题-动态规划
- 问题描述
- 问题分析
- 定义
- 递推公式:
- 算法实例
- 伪代码
- 代码实现
问题描述
某公司购买长钢条,将其切割为段钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。
假定我们知道公司出售一段长度为i英寸的钢条的价格为pi(i = 1, 2,…,单位为美元)。钢条的长度均为整英寸。下表给出了一个价格表的样例。
示例
输入钢条长度n:
10
输出最大收益和切割方案:
长度为10的钢条的最大收益为:27
对应的最优切割方案的解为:2 2 6
问题分析
定义
C[n]:记录切割长度为n的钢条可得最大总收益
rec[n]:记录长度为n的钢条的最优切割方案
递推公式:
假设有一段长度为10的钢条。如果最多切一次,有两种选择,分别是不切:收益=p[10],rec[10]=10;或者在i处切:收益=p[i]+p[10-i], rec[10]=i。如果最多切两次,可以先切一次,再将剩余钢条按照最多切一次的条件切割。所以可能存在最优子结构和重叠子问题。
假设钢条长度为 j ,最大收益C[ j ] = max ({ p[ i ]+C[ j−i ] , p[ j ] }) , 1<=i<=j:
如果不切:rec[ j ]=j; 如果在 i 处切:rec[ j ]=i
算法实例
当j=0时,没有收益,C[0]=0
当j=1时,不切,C[1]=1,rec[1]=1,输出最优切割方案{1}
当j=2时,p[1]+C[1]=2,p[2]=5,不切,C[2]=5,rec[2]=2,输出最优切割方案{2}
当j=3时,p[1]+C[2]=6,p[2]+C[1]=6,p[3]=8,不切,C[3]=8,rec[3]=3,输出最优切割方案{3}
当j=4时,p[1]+C[3]=9,p[2]+C[2]=10,p[3]+C[1]=9,p[4]=9,在2处切,C[4]=10,rec[4]=2,rec[2]=2,输出最优切割方案{2,2}
···
伪代码
输入:钢条长度 n;
输出:最大收益 C[n], 钢条切割方案;
//初始化
创建一维数组C[0,…,N] , rec[0,…,n]
C[0] = 0
//动态规划
for j <- 1 to n doq <- -1for <- 1 to j-1 doif q < p[i] + C[j - i] thenq <- p[i] + C[j - i]rec[j] <- iendendC[j] <- q;
end
输出最优方案
while n > 0 doprint rec[n]n <- n-rec[n]
end
# 代码实现
代码实现
#include <iostream>
#include<bits/stdc++.h>
using namespace std;void CutRod(int p[], int n, int C[], int rec[])
{//int C[n];记录切割长度为n的钢条可得最大总收益//int rec[n];记录长度为n的钢条的最优切割方案int q;//记录收益C[0] = 0;for (int j = 1; j <= n; ++j){q = p[j];rec[j] = j;for (int i = 1; i <= j-1; ++i){if (q < p[i] + C[j - i]){q = p[i] + C[j - i];rec[j] = i;}}C[j] = q;}cout << "长度为" << n << "的钢条的最大收益为:" <<C[n]<< endl;cout << "对应的最优切割方案的解为:";//输出最优切割方案while (n > 0){cout << rec[n] << " ";n = n - rec[n];}
}int main()
{int p[11] = { 0,1,5,8,9,10,17,17,20,24,24 };int C[11], rec[11], n;cin >> n;CutRod(p, n, C, rec);return 0;
}
该算法的时间复杂度是O(N^2)
钢条切割问题(动态规划)相关推荐
- 钢条切割问题-动态规划-c语言实现
问题:某公司购买长钢条,将其切割后进行出售.切割钢条的成本可以忽略不计,钢条的长度为整英寸.已知价格表p,其中pi(i=1,2,...,m)表示长度为i英寸的钢条的价格.现要求解使销售收益最大的切割方 ...
- 《算法导论》15章-动态规划 15.1 钢条切割(含有C++代码)
一.引入 动态规划方法通常用来求解最优化问题(optimizationproblem).这类问题可以有很多可行解,每个解都有一个值,我们希望寻找具有最优值(最小值或最大值)的解.我们称这样的解为问 题 ...
- 数据结构(python) —— 【34: 动态规划之钢条切割问题】
钢条切割问题 1. 问题 某公司出售钢条,出售价格与钢条长度之间的关系如下表: 问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大. 2. 思路 思考: 长度为n的钢条的不同切 ...
- 算法导论 动态规划钢条切割问题 C语言
动态规划钢条切割问题 动态规划(dynamic programming)与分治法类似.分治策略将问题划分为互不相交的子问题,递归求解子问题,再将子问题进行组合,求解原问题.动态规划应用于子问题重叠的情 ...
- 《算法导论》中动态规划求解钢条切割问题
动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契 ...
- 钢条分割 动态规划java_【动态规划】初识,钢条切割问题
正文之前其实动态规划老早之前就看过, 但是可惜的是印象不深,到今天彻底忘得差不多了,这两天看<算法导论>终于让我啃下了二叉搜索树和红黑树两个家伙,虽然还未曾熟练于胸,但是基本能用了...现 ...
- 动态规划,java实现算法导论15章钢条切割
来自浙江理工大学在读研究生Yuner: github地址 个人博客地址 此问题dp式 :rn = max(pi + r(n-1)) 不使用dp,用普通的递归方式来求解 //使用普通的方法来计算钢条切割 ...
- 动态规划经典例题:钢条切割
一.递归算法 如果在第i个地方切割,就把钢条分为两个长度为i,n-i的钢条,问题转化为求这切割两个钢条的最大价值之和 考虑到不切割时的价值 只要比较不切割时的价值和所有切割情况价值和的最大值即可 递归 ...
- 《算法导论》学习(十七)----动态规划之钢条切割(C语言)
文章目录 前言 一.钢条切割问题 1.问题背景 2.问题描述 3.问题的难点 (1)情况较多 (2)消除重复子问题 二.问题解决方案 1.问题的特点 (1)最优化子结构 (2)重复子问题 2.最优化解 ...
最新文章
- Windows Phone 7 MVVM模式通讯方式之实现Command
- 【数据结构与算法】之深入解析“H指数”的求解思路与算法示例
- 启动zookeeper_Giraph源码分析(一)—启动ZooKeeper服务
- angularjs 利用filter进行表单查询及分页查询
- java数组排序源码_Java 数组工具类排序,最大值最小值等
- Go语言_array,slice,map
- HighCharts:饼图判断是否选中
- 一核一g负载均衡不能超过多少_多核程序设计(考试题)
- unity 素材分享
- 2021-06-22
- 计算机无法打开这个应用,Windows10打开软件时提示“无法打开这个应用”怎么解决?...
- linux wifi设置端口号,Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
- echarts-箱线图(盒须图)
- 学习三部曲之(一):学生为什么学习不好?
- 使用C语言和DX库编写东方风格的STG射击游戏--------前言
- 中国配电自动化设备市场趋势报告、技术动态创新及市场预测
- 山西财经大学计算机好考吗,听说这是中国最难考的12所“财经”大学,山西财经大学入选,位列第十!...
- 降低FFmpeg的解码延时
- Spire.Office 7.8.4 for NET --2022-08-17
- 《精通Python自然语言处理( Deepti Chopra)》读书笔记(第三章):形态学
热门文章
- 精通RPM之--制作篇(上) 原作:雨亦奇 赵建利
- MySQL 查看和终止正在运行的连接线程
- java 制作 winrar,windows 上java调用winrar压缩文件为rar 格式
- mysql 备库 1032_【MySQL 5.7 】从库1032 报错处理
- 虽然不能去故宫办婚礼,但你可以帮故宫找“中纹”啊!
- java 弧度 转经纬度_GPS 经纬度转换为 经过旋转后的平面坐标详解
- 淘宝补单发货地不一样可以吗?正确补单流程是什么?
- 由Python 学习受挫想到的激励自己学习的方法
- iPhone XS 陷“充电门”:待机状态拒绝充电
- python爬取妹子图网健康图片