钢条切割问题-动态规划

  • 问题描述
  • 问题分析
    • 定义
    • 递推公式:
    • 算法实例
  • 伪代码
  • 代码实现

问题描述

某公司购买长钢条,将其切割为段钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。
假定我们知道公司出售一段长度为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)

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

  1. 钢条切割问题-动态规划-c语言实现

    问题:某公司购买长钢条,将其切割后进行出售.切割钢条的成本可以忽略不计,钢条的长度为整英寸.已知价格表p,其中pi(i=1,2,...,m)表示长度为i英寸的钢条的价格.现要求解使销售收益最大的切割方 ...

  2. 《算法导论》15章-动态规划 15.1 钢条切割(含有C++代码)

    一.引入 动态规划方法通常用来求解最优化问题(optimizationproblem).这类问题可以有很多可行解,每个解都有一个值,我们希望寻找具有最优值(最小值或最大值)的解.我们称这样的解为问 题 ...

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

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

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

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

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

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

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

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

  7. 动态规划,java实现算法导论15章钢条切割

    来自浙江理工大学在读研究生Yuner: github地址 个人博客地址 此问题dp式 :rn = max(pi + r(n-1)) 不使用dp,用普通的递归方式来求解 //使用普通的方法来计算钢条切割 ...

  8. 动态规划经典例题:钢条切割

    一.递归算法 如果在第i个地方切割,就把钢条分为两个长度为i,n-i的钢条,问题转化为求这切割两个钢条的最大价值之和 考虑到不切割时的价值 只要比较不切割时的价值和所有切割情况价值和的最大值即可 递归 ...

  9. 《算法导论》学习(十七)----动态规划之钢条切割(C语言)

    文章目录 前言 一.钢条切割问题 1.问题背景 2.问题描述 3.问题的难点 (1)情况较多 (2)消除重复子问题 二.问题解决方案 1.问题的特点 (1)最优化子结构 (2)重复子问题 2.最优化解 ...

最新文章

  1. Windows Phone 7 MVVM模式通讯方式之实现Command
  2. 【数据结构与算法】之深入解析“H指数”的求解思路与算法示例
  3. 启动zookeeper_Giraph源码分析(一)—启动ZooKeeper服务
  4. angularjs 利用filter进行表单查询及分页查询
  5. java数组排序源码_Java 数组工具类排序,最大值最小值等
  6. Go语言_array,slice,map
  7. HighCharts:饼图判断是否选中
  8. 一核一g负载均衡不能超过多少_多核程序设计(考试题)
  9. unity 素材分享
  10. 2021-06-22
  11. 计算机无法打开这个应用,Windows10打开软件时提示“无法打开这个应用”怎么解决?...
  12. linux wifi设置端口号,Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
  13. echarts-箱线图(盒须图)
  14. 学习三部曲之(一):学生为什么学习不好?
  15. 使用C语言和DX库编写东方风格的STG射击游戏--------前言
  16. 中国配电自动化设备市场趋势报告、技术动态创新及市场预测
  17. 山西财经大学计算机好考吗,听说这是中国最难考的12所“财经”大学,山西财经大学入选,位列第十!...
  18. 降低FFmpeg的解码延时
  19. Spire.Office 7.8.4 for NET --2022-08-17
  20. 《精通Python自然语言处理( Deepti Chopra)》读书笔记(第三章):形态学

热门文章

  1. 精通RPM之--制作篇(上) 原作:雨亦奇 赵建利
  2. MySQL 查看和终止正在运行的连接线程
  3. java 制作 winrar,windows 上java调用winrar压缩文件为rar 格式
  4. mysql 备库 1032_【MySQL 5.7 】从库1032 报错处理
  5. 虽然不能去故宫办婚礼,但你可以帮故宫找“中纹”啊!
  6. java 弧度 转经纬度_GPS 经纬度转换为 经过旋转后的平面坐标详解
  7. 淘宝补单发货地不一样可以吗?正确补单流程是什么?
  8. 由Python 学习受挫想到的激励自己学习的方法
  9. iPhone XS 陷“充电门”:待机状态拒绝充电
  10. python爬取妹子图网健康图片