【动态规划】切割钢条详解python

1. 问题介绍和应用场景

切割钢条问题是运筹学和算法设计中的一个经典问题,涉及如何最优化切割有限资源以最大化收益。这个问题经常用作动态规划教学的入门案例,同时在工业生产中也有实际应用,比如在金属加工业中如何切割原材料以减少浪费并增加销售利润。

2. 初阶问题-价值最大

定义:给定一根长度为 ( n ) 的钢条和一个价格表,表中列出了从长度 1 到 ( n ) 的每一种长度的钢条的售价。求切割方案,使得销售收益最大化。

示例

  • 钢条长度:4
  • 价格表:{1:1, 2:5, 3:8, 4:9}

最优切割方案是切割为两段,每段长度为 2,销售收益为 ( 5 + 5 = 10 )。

状态定义

定义 dp[i] 为长度为 ( i ) 的钢条的最大销售收益。

状态转移方程

考虑每一种可能的切割第一刀的位置,状态转移方程为:

在这里插入图片描述

初始化和边界情况

  • ( dp[0] = 0 ):长度为 0 的钢条没有收益。

算法实现

def cut_rod(price, n):dp = [0] * (n + 1)for i in range(1, n + 1):max_val = float('-inf')for j in range(1, i + 1):max_val = max(max_val, price[j] + dp[i - j])dp[i] = max_valreturn dp[n]# 示例使用
price = {1: 1, 2: 5, 3: 8, 4: 9}
n = 4
print("最大收益:", cut_rod(price, n))  # 输出: 最大收益: 10
复杂度分析
  • 时间复杂度:O(n^2),其中 ( n ) 是钢条的长度。需要计算每个长度的最优解,每次计算涉及遍历所有可能的切割点。
  • 空间复杂度:O(n),存储长度为 ( n ) 的 dp 数组。

算法图解

为了进一步阐明“切割钢条”问题的动态规划解法,并辅以图解,我们将使用一个示例和配套的说明来详细解释每一步的计算过程。我们继续用整数数组 price = {1:1, 2:5, 3:8, 4:9} 和钢条长度 n = 4 来演示。

首先,我们初始化动态规划表 dp。表的每个单元格将代表长度为 (i) 的钢条的最大销售收益。

初始化

初始 dp

Length ((i))01234
dp[i]00000
  • dp[0] = 0:没有钢条时,收益为0。
填充过程

逐步计算每个长度的最大收益。

  1. 长度为 1:

    • 只有一种切法,即不切,直接卖出。
    • dp[1] = price[1] = 1
  2. 长度为 2:

    • 切为两个长度为 1 的钢条,或不切。
    • dp[2] = max(price[2], price[1] + dp[1]) = max(5, 1+1) = 5
  3. 长度为 3:

    • 切为三个长度为 1 的钢条,切为一个长度为 1 和一个长度为 2 的钢条,或不切。
    • dp[3] = max(price[3], price[1] + dp[2], price[2] + dp[1]) = max(8, 1+5, 5+1) = 8
  4. 长度为 4:

    • 切为四个长度为 1 的钢条,切为两个长度为 2 的钢条,切为一个长度为 1 和一个长度为 3 的钢条,或不切。
    • dp[4] = max(price[4], price[1] + dp[3], price[2] + dp[2], price[3] + dp[1]) = max(9, 1+8, 5+5, 8+1) = 10

最终填充的 dp

Length ((i))01234
dp[i]015810
图解说明

想象一个表格,行表示钢条长度,列代表不同的切割方案。每个单元格填入该切割方案的收益,最后选择每行中的最大值填入到 dp 表中。每次切割决策基于获取最大收益的需要。

   +---------------------------------------+| Length | Cut Scenario                 |+---------------------------------------+|   1    | [1] -> 1                     ||   2    | [1+1], [2] -> 5              ||   3    | [1+1+1], [1+2], [3] -> 8     ||   4    | [1+1+1+1], [2+2], [1+3], [4] -> 10 |+---------------------------------------+

3.进阶问题-最优切割方案

在讨论切割钢条问题或任何涉及资源分割的优化问题时,“最优切割方案”指的是通过合理分割资源(如钢条、织物等)以达到某个特定目标(如最大化利润、最小化浪费等)的一种策略或方案。在动态规划的上下文中,这通常涉及确定一系列决策,这些决策共同导致全局最优的结果。

最优切割方案的定义

在切割钢条的例子中,钢条有一定长度,每个长度有一个对应的市场价值。最优切割方案就是找到一种切割钢条的方式,使得从出售这些切割后的小段钢条所获得的总收益最大化。

关键组件

  • 目标:最大化从出售切割后的钢条获得的收益。
  • 决策:选择在哪些点切割钢条,包括决定每一段的长度。
  • 状态:用于描述问题的某个阶段或条件,如钢条的当前长度。
  • 状态转移:决策导致状态改变,进而更新问题的当前解的方式,如从更长的钢条到切割后的剩余部分。

如何找到最优切割方案

  1. 定义状态

    • dp[i] 表示长度为 i 的钢条的最大销售收益。
  2. 状态转移方程

    • dp[i] = max(dp[i], price[j] + dp[i-j]),其中 1 ≤ j ≤ i 是可能的切割点,price[j] 是长度 j 的钢条的价格。
  3. 记录切割点

    • 使用一个辅助数组 s[i] 来记录获得 dp[i] 的最大收益时的首次切割点。
  4. 回溯切割方案

    • s[n] 开始回溯,其中 n 是钢条的总长度,通过连续查询 s 数组构建出全部的切割方案。

示例

假设有一根长度为 4 的钢条,价格表如下:

长度1234
价格1589

最优切割方案为两段,每段长度为 2,因为 5 + 5 = 10 是所有可能切割方案中收益最高的(切割为 1+1+1+1 的收益为 4,切割为 1+33+1 的收益为 9,不切割的收益为 9)。

通过定义动态规划的状态和决策过程,以及记录每个决策点,我们可以确定并回溯出达到最大收益的具体切割步骤,即最优切割方案。这种方法不仅减少了试错的需要,而且提供了一种系统的方式来解决问题。

总结

切割钢条问题通过动态规划提供了一种有效的解决方案,能够处理资源优化问题并可扩展到更复杂的场景中。这种方法不仅提升了问题解决的效率,也增强了理解动态规划的直观性和实用性。掌握这种基础的动态规划应用能够帮助解决更广泛的优化问题,是算法学习和应用中的重要步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EelasticSearch是什么?及EelasticSearch的安装

一、概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计,提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据,并且具备横向扩展能力,能够通过增加更多的…

Jmeter三个常用组件

Jmeter三个常用组件 一、线程组二、 HTTP请求三、查看结果树 线程组:jmeter是基于线程来运行的,线程组主要用来管理线程的数量,线程的执行策略。 HTTP请求:HTTP请求是jmeter接口测试的核心部分,主要使用HTTP取样器来发…

Android 12 如何加载 native 原生库

在 Android 7.0 及更高版本中,系统库与应用库是分开的。 图1. 原生库的命名空间 原生库的命名空间可防止应用使用私有平台的原生 API(例如使用 OpenSSL)。该命名空间还可以避免应用意外使用平台库(而非它们自己的库)的…

ES源码四:网络通信层流程

听说ES网络层很难?今天来卷它😄 前言 ES网络层比较复杂,分为两个部分: 基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块(NetworkModule) 入口还是上一章的创建Node构造方法的地方…

【MySQL 安装与配置】Window简单安装MySQL,并配置局域网连接

文章日期:2024.04.17 系统:Window10 || Window11 类型:安装与配置MySQL数据库 文章全程已做去敏处理!!! 【需要做的可联系我】 AES解密处理(直接解密即可)(crypto-js.js…

系统稳定性建设

说到系统稳定性,不知道大家会想起什么?大多数人会觉得这个词挺虚的,不知道系统稳定性指的是什么。 一年前看到这个词,也是类似于这样的感受,大概只知道要消除单点、做好监控报警,但却并没有一个体系化的方…

记录一下我102连不上MySQL的问题 NotBefore

【背景描述】我在102上是能登录上MySQL的,但是用客户端(DataGrip、SQLyog就连不上) 【解决方案】 加个这个?useSSLfalse&serverTimezoneUTC 【另外的小问题】如果直接输mysql 上面这个不是报错,不用管 再输mysql -uroot -p…

upload-labs靶场详解

靶场环境 下载链接:https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master 使用小皮集成环境来完成这个靶场 将文件放到WWW目录下就可以进行访问 进入关卡后页面呈现: Pass-01(前端绕过) 我们先尝试上传一个web.…

[svelte]属性和逻辑块

属性 / Default values • Svelte 教程 | Svelte 中文网 属性 Declaring props 到目前为止,我们只处理了内部状态——也就是说,这些值只能在给定的组件中访问。 在任何实际应用程序中,都需要将数据从一个组件向下传递到其子组件。为此&…

【Spring】-编程式事务和声明式事务

spring中控制事务的方式有两种:编程式事务和声明式事务,今天我以两种事务出发,对spring中实现事务的EnableTransactionManagement和Transaction两个注解的底层原理进行讨论。 一、编程式事务 什么是编程式事务? 硬编码的方式实现…

Adobe将Sora、Runway、Pika,集成在PR中

4月15日晚,全球多媒体巨头Adobe在官网宣布,将OpenAI的Sora、Pika 、Runway等著名第三方文生视频模型,集成在视频剪辑软件Premiere Pro中(简称“PR”)。 同时,Adob也会将自身研发的Firefly系列模型包括视频…

【Python】高级进阶(专版提升3)

Python 1 程序结构1.1 模块 Module1.1.1 定义1.1.2 作用1.1.3 导入1.1.3.1 import1.1.3.2 from import 1.1.4 模块变量1.1.5 加载过程1.1.6 分类 1.2 包package1.2.1 定义1.2.2 作用1.2.3 导入1.1.3.1 import1.1.3.2 from import 2 异常处理Error2.1 异常2.2 处理 3 迭代3.1 可…

Three.js 入门——核心概念和坐标系理解

Three.js 是什么? 一个封装了 WebGL 的库,简化 WebGL 的使用 WebGL vs OpenGL OpenGL 主要被认为是一种 API(应用程序编程接口),它为我们提供了大量可用于操作图形和图像的函数,主要用 C语言编写的。 然…

python辅助QQ登入

python辅助QQ登入 import pyautogui import time import random from pyautogui import ImageNotFoundException# 生成随机等待时间,范围在1到3秒之间 random_time random.uniform(1, 3)def find_and_click(image_path, moveFalse, execute_nextTrue):try:image_l…

【QT学习】7.事件,把文本显示在页面中(文本可变),鼠标指针切换,鼠标左键右键按下,qt设置背景样式

0.创建项目,事件的创建 1.事件的位置 2.这就是多态,子类重写父类函数,子类调用子类函数,也可以调用父类函数。但同函数名 1.要求:文本显示在页面中(文本可变) 1.文本显示在页面的核心代码 主要步…

DRF requets源码分析

【四】requets源码分析 【1】查看request传递的数据 (1)视图层 编写传输数据的接口查看request方法的参数 class BookAPIView(APIView):def get(self, request, *args, **kwargs):return Response({body: request.body, data: request.data, post: r…

【Web】DASCTF X GFCTF 2022十月挑战赛题解

目录 EasyPOP hade_waibo EasyLove BlogSystem EasyPOP 先读hint.php sorry.__destruct -> secret_code::secret() exp: $anew sorry(); $bnew secret_code(); $a->password"suibian"; $a->name"jay"; echo serialize($a); 真暗号啊&…

web项目中jsp页面不识别el表达式

如果使用el表达式出现下图问题 ** 解决办法 ** 这是因为maven创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 修改web.xml文件开头的web-app的版本 <?xml version"1.0" encoding"UTF-8"?> <web-app x…

Python爬取猫眼电影票房 + 数据可视化

目录 主角查看与分析 爬取可视化分析猫眼电影上座率前10分析猫眼电影票房场均人次前10分析猫眼电影票票房占比分析 主角查看与分析 爬取 对猫眼电影票房进行爬取&#xff0c;首先我们打开猫眼 接着我们想要进行数据抓包&#xff0c;就要看网站的具体内容&#xff0c;通过按F12…

Postman之安装

Postman工具之介绍与安装 Postman是什么&#xff1f;Postman有几种安装方式&#xff1f; Postman是什么&#xff1f; postman是一款http客户端的模拟器&#xff0c;它可以模拟发出各种各样的网络请求&#xff0c;用于接口测试。 Postman有几种安装方式&#xff1f; 两种&…