(说明:由于CSDN的博客中不能添加下标等特殊符号,所以部分内容使用截图的形式)
通过对问题进行高度抽象,现在我们的问题,就是要递归地求解r n 的最大值,下面采用的是一种自顶向下的递归方法:
int p[] = {1, 5, 8, 9, 10, 17, 17,20, 24, 30};static inline int max(i, j)
{return (i > j ? i : j);
}int cut_mod(int *p, int n)
{int i;int q;if (n == 0) {return 0;}q = -1;for (i = 0; i < n; ++i) {q = max(q, p[i] + cut_mod(p, n - i - 1));}return q;
}

int bottom_up_cut_mod(int *p, int n)
{int i, j, q;int r[n + 1];r[0] = 0;for (j = 1; j <= n; ++j) {q = -1;for (i = 1; i <= j; ++i) {q = max(q, p[i - 1] + r[j - i]);}r[j] = q;}return r[n];
}
实现中max()函数及p的定义参见cut_mod()的实现。这里对实现做一个说明:第一个循环计算的是来选择长度,长度为j;第二个循环是计算长度为j时的最优解。过程是这样的:当j为1时,也就是说此时长度为1,这时最优解q=max(-1,p[0]+r[0]),此时q=p[0],即长度为1英寸的钢条的售价;当j为2时,此时长度为2,这时最优解就要在i=1和i=2之间进行选择,而i=1时的值在第一次循环中已计算出来保存在r数组中,i=2时等于是不切割。所以每次循环计算到j时,依赖的j-1对应的最优解已经计算出来,不需要再重复计算。
bottom_up_cut_mod()的实现只是给出了最优解,但是并没有保存最优解方案,也就是如何来切割。下面给出的bottom_up_cut_rod()的扩展版本,它对长度为j的钢条不仅计算最大收益值r j,还保存最优解对应的第一段钢条的切割长度s j(也就是我们前边说到的左边一段的长度,这段是不再进行切割的):
int extend_bottom_up_cut_mod(int *p, int n, int *s)
{int i, j, q;int r[n + 1];r[0] = 0;for (j = 1; j <= n; ++j) {q = -1;for (i = 1; i <= j; ++i) {if (q < p[i - 1] + r[j - i]) {q = p[i - 1] + r[j - i];s[j] = i;}}r[j] = q;}return r[n];
}
static void print_cut_mod_solution(int n, int *s)
{while (n) {printf("%d ", s[n]);n = n - s[n];}
}

算法学习笔记----用动态规划解决钢管切割问题相关推荐

  1. Python最优化算法学习笔记(Gurobi)

    微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...

  2. 基于MVS的三维重建算法学习笔记(四)— 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(四)- 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读 声明 SGM概述 Cost Calculation(像素代价计算)--M ...

  3. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  4. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  5. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  6. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  7. 基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(五)- 立体匹配经典算法PatchMatch论文翻译及要点解读 声明 问题提出 问题建模 通过PatchMatch获取平面参数--Inference via Patc ...

  8. 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

    数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...

  9. Python预测 数据分析与算法 学习笔记(特征工程、时间序列)

    微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...

最新文章

  1. python全栈开发笔记--------条件语句
  2. 最详细的SQL注入相关的命令整理
  3. ExtJS 2.0官方实例目录
  4. javaweb异常笔记
  5. 阿里云弹性高性能计算E-HPC强势来袭,全新打造一站式云超算
  6. 【android】ActivityGroup初体验
  7. 高性能MySQL—第一章 MySQL架构与历史
  8. Shell(6): 多线程操作及线程数
  9. matlab subplot(figure)如何设置使得图像最终显示出来不一样大小
  10. [我的阿里云服务器] —— 安装LAMP
  11. MATLAB绘制地图超详细教程
  12. 背包问题1:【SSL】1059.01背包问题——2021-03-10更
  13. 机器学习基础篇-逻辑回归和多分类问题
  14. 栈区的使用规则、压栈和出栈、栈区先进后出,后进先出
  15. 什么是Photoshop中的图层和蒙版?
  16. C#登录拍拍,总是提示输入有误
  17. 雨听|在wps中将某一页ppt导出为图片
  18. Javascript深入浅出之闭包
  19. 软件项目任务分解的概念
  20. android canvas 工作流_Activiti工作流引擎使用

热门文章

  1. SqlServer数据库定期自动备份与清除
  2. 二、Spring Cloud 极简入门-Spring Cloud简介
  3. PCIE设备访问及其配置空间
  4. 考研复试英语介绍计算机专业,2018计算机考研复试英语自我介绍范本及重点
  5. java版本的escape和unescape函数
  6. 微程序CPU+8253+8255实现流水灯
  7. L1-036 A乘以B Python
  8. The installation cannot continue as the installer file may be damaged. Download the installer file a
  9. PyQt5最全60 容器之QMdiArea和QMdiSubWindow容纳多文档的窗口
  10. #1135 : Magic Box(枚举)