本文介绍应用动态规划算法求解 cutting stock 问题的案例。
类似地,动态规划算法也可以用来求解背包问题。

其他动态规划的应用实例:
动态规划的应用(一):最短路问题
动态规划的应用(三):字符串相关问题
动态规划的应用(四):LeetCode 1900. 最佳运动员的比拼回合
动态规划的应用(五):LeetCode 413, 446. 等差数列划分
动态规划的应用(六):矩阵相关问题

钢条的价格如下表所示,求最大利润。(选自《算法导论》)

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

递归版本

动态规划的递归版本代码如下:

from typing import Listdef cut_run(p: List[int]) -> int:r = [0 for _ in range(len(p))]  # "备忘录",存储各长度下的最优解return cut(p=p, n=len(p), r=r)def cut(p: List[int], n: int, r: List[int]) -> int:if r[n - 1] > 0:  # 查找备忘录,避免重复遍历解空间return r[n - 1]if not n:return 0q = 0for i in range(1, n + 1):q = max(q, p[i - 1] + cut(p, n - i, r))  # 递归方程r[n - 1] = q  # 更新备忘录print("备忘录元素 {0} 更新为 {1},列表 {2}".format(n, q, r))return qp_ = [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]print()
q_ = cut_run(p=p_)
print()
print("最大利润: {}".format(q_), '\n')

运行结果:

备忘录元素 1 更新为 1,列表 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
备忘录元素 2 更新为 5,列表 [1, 5, 0, 0, 0, 0, 0, 0, 0, 0]
备忘录元素 3 更新为 8,列表 [1, 5, 8, 0, 0, 0, 0, 0, 0, 0]
备忘录元素 4 更新为 10,列表 [1, 5, 8, 10, 0, 0, 0, 0, 0, 0]
备忘录元素 5 更新为 13,列表 [1, 5, 8, 10, 13, 0, 0, 0, 0, 0]
备忘录元素 6 更新为 17,列表 [1, 5, 8, 10, 13, 17, 0, 0, 0, 0]
备忘录元素 7 更新为 18,列表 [1, 5, 8, 10, 13, 17, 18, 0, 0, 0]
备忘录元素 8 更新为 22,列表 [1, 5, 8, 10, 13, 17, 18, 22, 0, 0]
备忘录元素 9 更新为 25,列表 [1, 5, 8, 10, 13, 17, 18, 22, 25, 0]
备忘录元素 10 更新为 30,列表 [1, 5, 8, 10, 13, 17, 18, 22, 25, 30]最大利润: 30

非递归版本

动态规划的非递归版本代码如下:

from typing import Listdef cut(p: List[int]) -> int:r = [0 for _ in range(len(p) + 1)]for i in range(1, len(p) + 1):  # 外循环:求备忘录列表 rq = 0for j in range(1, i + 1):  # 内循环:求备忘录列表 r 各元素的值q = max(q, p[j - 1] + r[i - j])r[i] = qprint("备忘录元素 {0} 更新为 {1},列表 {2}".format(i + 1, q, r))return r[len(p)]p_ = [1, 5, 8, 9, 10, 17, 17, 20, 24, 30]print()
q_ = cut(p=p_)
print()
print("最大利润: {}".format(q_), '\n')

显然,运行结果与递归版本相同。

动态规划的应用(二):cutting stock 问题相关推荐

  1. cutting stock 问题的列生成算法

    本文以 cutting stock 问题为例,介绍列生成算法的数学模型. 1. 问题描述 长板长度:10m 子板需求:2m: 100; 3m: 50; 5m: 20 - 优化目标:最小化,长板切割总数 ...

  2. 【Column Generation思考-02】|从对偶的角度理解Cutting Stock Problem【更新版本】

    [Column Generation思考-01]|从对偶的角度理解 Cutting Stock Problem简介 Cutting Stock Problem的Column generation re ...

  3. 第十五章 动态规划——最优二叉搜索树

    1.前言: 接着学习动态规划方法,最优二叉查找树问题.二叉查找树参考http://www.cnblogs.com/Anker/archive/2013/01/28/2880581.html.如果在二叉 ...

  4. 动态规划最优二叉搜索树C语言,【算法导论】动态规划之“最优二叉搜索树”...

    详解动态规划之"最优二叉搜索树" 之前两篇分别讲了动态规划的"钢管切割"和"矩阵链乘法",感觉到了这一篇,也可以算是收官之作了.其实根据前两 ...

  5. 动态规划——最优二叉搜索树

     (二叉搜索树即二叉排序树,该题并不是问如何构造最优二叉树,而是如何在二叉搜索树中达成最优搜索效率) 简而言之,这个最优二叉搜索树的每个根节点都大于左子树的任一元素,小于其右子树的任意元素,相当于用根 ...

  6. 最优二叉搜索树java_动态规划-最优二叉搜索树

    算法思想:动态规划 实际问题:最优二叉搜索树 编写语言:Java 问题描述 二叉搜索树的定义: 满足以下任意两个条件的一个,就可称这棵树为二叉搜索树: 它是一棵空树 该树是一颗二叉树,非空,且满足下列 ...

  7. 【动态规划】(二)最大子段和

    最大子段和 一.什么是最大子段和 在这里,要区别一下"子段"与"子序列".子段是指连续的一部分,例如"23"是"12345&quo ...

  8. 动态规划 —— 背包问题 P05 —— 二维背包

    [问题] 对于每件物品,具有两种不同的体积,选择这件物品必须同时付出这两种代价,对于每种代价都有一个可付出的最大值(背包容量). 问:怎样选择物品可以得到最大的价值? 设:这两种代价分别为代价1和代价 ...

  9. c语言动态规划最优二叉搜索树,最优二叉搜索树(动态规划)

    #include #include #include #include #include enum:int { MAXVALUE=999 }; template class BestTree{ pri ...

最新文章

  1. 某产品经理炫耀:3年跳槽3次,月薪从8k涨到38k,跳槽涨薪最快!
  2. 使用docker中mysql镜像
  3. ack机制之代码实现,实现BaseRichBolt的方式,使用BaseBasicBolt的方式实现BaseRichBolt发ack和fail的功能
  4. MyBatis 缓存详解-缓存体系结构
  5. 转:26个Jquery使用小技巧(jQuery tips, tricks solutions)
  6. Java多线程编程 — 锁优化
  7. MATLAB中常见的取整函数
  8. python构建huffman树_python:哈夫曼树,PythonHuffuman
  9. redis介绍及常见用法
  10. if else 的或(||)
  11. 分享一些软件工具~截图工具
  12. C++打卡17-【排序模板】选择排序
  13. 计算机主机组件图,电脑主机结构图大全
  14. java.io.IOException: Server returned HTTP response code: 503 for UR
  15. 6.5 发散思维能力
  16. docker搭建searx_『颜值即正义』看小睿“自建搜索引擎”
  17. Nginx反向代理实现负载均衡配置图解
  18. pythonturtle简单绘图_10分钟轻松学会 Python turtle 绘图
  19. 深入理解JVM之三:垃圾回收算法
  20. 服务器硬盘出现坏道导致数据丢失的数据恢复过程

热门文章

  1. 2022年执法资格通用法律知识考试判断题专项训练题及答案
  2. JavaFx(OpenJFX)安装教程详细版
  3. 教育培训行业市场营销推广的主要方式有哪些
  4. Java开发微信公众号-接口测试帐号接口配置及Java源代码
  5. 用pygame做一个简单的python小游戏---生命游戏
  6. Qt QNetwork 下载文件
  7. 微信小程序调用update更新数据库数据无效
  8. win32原生API实现OpenGL例子(无glew,glut等第三方依赖库)
  9. Bootstrap(三) 网格系统
  10. win10系统编辑服务器在哪个文件夹,文件夹选项在哪里,小编教你Win10文件夹选项在哪...