动态规划的应用(二):cutting stock 问题
本文介绍应用动态规划算法求解 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 问题相关推荐
- cutting stock 问题的列生成算法
本文以 cutting stock 问题为例,介绍列生成算法的数学模型. 1. 问题描述 长板长度:10m 子板需求:2m: 100; 3m: 50; 5m: 20 - 优化目标:最小化,长板切割总数 ...
- 【Column Generation思考-02】|从对偶的角度理解Cutting Stock Problem【更新版本】
[Column Generation思考-01]|从对偶的角度理解 Cutting Stock Problem简介 Cutting Stock Problem的Column generation re ...
- 第十五章 动态规划——最优二叉搜索树
1.前言: 接着学习动态规划方法,最优二叉查找树问题.二叉查找树参考http://www.cnblogs.com/Anker/archive/2013/01/28/2880581.html.如果在二叉 ...
- 动态规划最优二叉搜索树C语言,【算法导论】动态规划之“最优二叉搜索树”...
详解动态规划之"最优二叉搜索树" 之前两篇分别讲了动态规划的"钢管切割"和"矩阵链乘法",感觉到了这一篇,也可以算是收官之作了.其实根据前两 ...
- 动态规划——最优二叉搜索树
(二叉搜索树即二叉排序树,该题并不是问如何构造最优二叉树,而是如何在二叉搜索树中达成最优搜索效率) 简而言之,这个最优二叉搜索树的每个根节点都大于左子树的任一元素,小于其右子树的任意元素,相当于用根 ...
- 最优二叉搜索树java_动态规划-最优二叉搜索树
算法思想:动态规划 实际问题:最优二叉搜索树 编写语言:Java 问题描述 二叉搜索树的定义: 满足以下任意两个条件的一个,就可称这棵树为二叉搜索树: 它是一棵空树 该树是一颗二叉树,非空,且满足下列 ...
- 【动态规划】(二)最大子段和
最大子段和 一.什么是最大子段和 在这里,要区别一下"子段"与"子序列".子段是指连续的一部分,例如"23"是"12345&quo ...
- 动态规划 —— 背包问题 P05 —— 二维背包
[问题] 对于每件物品,具有两种不同的体积,选择这件物品必须同时付出这两种代价,对于每种代价都有一个可付出的最大值(背包容量). 问:怎样选择物品可以得到最大的价值? 设:这两种代价分别为代价1和代价 ...
- c语言动态规划最优二叉搜索树,最优二叉搜索树(动态规划)
#include #include #include #include #include enum:int { MAXVALUE=999 }; template class BestTree{ pri ...
最新文章
- 某产品经理炫耀:3年跳槽3次,月薪从8k涨到38k,跳槽涨薪最快!
- 使用docker中mysql镜像
- ack机制之代码实现,实现BaseRichBolt的方式,使用BaseBasicBolt的方式实现BaseRichBolt发ack和fail的功能
- MyBatis 缓存详解-缓存体系结构
- 转:26个Jquery使用小技巧(jQuery tips, tricks solutions)
- Java多线程编程 — 锁优化
- MATLAB中常见的取整函数
- python构建huffman树_python:哈夫曼树,PythonHuffuman
- redis介绍及常见用法
- if else 的或(||)
- 分享一些软件工具~截图工具
- C++打卡17-【排序模板】选择排序
- 计算机主机组件图,电脑主机结构图大全
- java.io.IOException: Server returned HTTP response code: 503 for UR
- 6.5 发散思维能力
- docker搭建searx_『颜值即正义』看小睿“自建搜索引擎”
- Nginx反向代理实现负载均衡配置图解
- pythonturtle简单绘图_10分钟轻松学会 Python turtle 绘图
- 深入理解JVM之三:垃圾回收算法
- 服务器硬盘出现坏道导致数据丢失的数据恢复过程
热门文章
- 2022年执法资格通用法律知识考试判断题专项训练题及答案
- JavaFx(OpenJFX)安装教程详细版
- 教育培训行业市场营销推广的主要方式有哪些
- Java开发微信公众号-接口测试帐号接口配置及Java源代码
- 用pygame做一个简单的python小游戏---生命游戏
- Qt QNetwork 下载文件
- 微信小程序调用update更新数据库数据无效
- win32原生API实现OpenGL例子(无glew,glut等第三方依赖库)
- Bootstrap(三) 网格系统
- win10系统编辑服务器在哪个文件夹,文件夹选项在哪里,小编教你Win10文件夹选项在哪...