【动态规划】钢条切割问题

动态规划: 钢条切割的三种解法 /* 钢条切割 不同长度的钢条对应不同的价格 给定一定长度的钢条,怎样切割利益最大 注意: 最优解可能是完全不需要切割 */ #include <vector> #include <iostream> using namespace std; //给定长度从1到10对应的不同价格 vector<int> price{0, 1, 5, 8, 9, 10, 1... 阅读详情

本人在学习《算法导论》的过程中,对于动态规划这部分的内容不是特别理解,于是决定做一下学习与解决记录,欢迎讨论交流。

0- 动态规划问题的一般步骤

1- 刻画一个最优解的结构特征
2- 递归定义最优解的值
3- 计算最优解的值,通常采用自底向上的方法
4- 利用计算出的信息构造一个最优解

1- 问题描述

Serling 公司购买长钢条,将其切割为锻钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。
假定我们知道Serling公司出售一段长度为i英寸的钢条的价格为pi(i = 1, 2,…,单位为美元)。钢条的长度均为整英寸。下表给出了一个价格表的样例。

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

2-问题分析

钢条切割问题是这样的:给定一段长度为n英寸的钢条和一个价格表p(i)(i = 1, 2,…,n),求切割钢条方案,使得销售收益rn最大。注意如果长度为n英寸的钢条价格p(n)足够大,最优解可能是完全不需要切割。

考虑n=4的情况。下图给出了4英寸钢条的所有可能切割方案,包括根本不切割的方案。从下图可以看出,将一段长度为4英寸的钢条切割为两段各长为2英寸的钢条,将产生p(2)+p(2)=5+5=10的收益,为最优解。

图1 钢条切割方案

对于最优收益rn(n≥1)可以用更短的钢条的最优收益来描述:

r n = max(p n,r 1+r n-1,r 2+r n-2,...,r n-1+r 1)

第一个参数pn对应不切割,直接出售长度为n英寸的钢条的方案。其中n-1个参数对应另外n-1种方案:对每个i = 1, 2, …, n-1,首先将钢条切割为i和n-i的两段,接着求解这两段的最优切割收益ri和rn -i(每种方案的最优收益为两段的最优收益之和)。由于无法预知那种方案的将获得最佳收益,所以必须考虑所有可能的i,选取其中的收益最大者。如果直接出售圆钢条会获得最大收益,当然可以不做任何切割。

可以看出,通过组合两个子问题(完成首次切割之后,即将问题转化为求解两个独立的钢条切割问题实例)的最优解,并在所有可能得两段切割方案中选取组合收益最大者,构成原问题的最优解。

钢条问题是满足最优子结构的(optimal substructure) 性质的:问题的最优解由相关子问题的最优解组合而成,而且这些子问题可以独立求解。

3-自顶向下递归实现

简单的递归求解方法: 将钢条从左边切割下长度为i的一段,只对右边剩余的长度为n-i的一段继续进行切割(递归求解),对左边的一段则不再进行切割。问题的分解方式为:将长度为n的钢条分解为左边的开始一段,以及剩余部分继续分解的结果。这样,不做任何切割的方案可以描述为:第一段的长度为你n,收益为pn,剩余部分的长度为0,对应的收益r0=0。 于是可以得到如下公式:

r n = max(p i +r n-i)

原问题的最优解只包含一个相关子问题(右边剩余部分)的解。下面给出朴素递归算法的解:

#include <iostream>
#include <vector>
#include <limits.h>
#include <algorithm>

using namespace std;

vector<int> price{
   
   1, 5, 8, 9, 10, 17, 17, 20, 24, 30};//钢条对应的价格

int CutRod(vector<int> &price, int length){
   
   
    if(length == 0) return 0;//如果钢条长度为0,直接返回
    int maxvalue = INT_MIN;//因为钢条价格为正值,所以首先默认maxvalue为最小值
    for(int i = 1; i <= length; ++i){
   
   
    //取前一次迭代算得的maxvalue与本次迭代结果的最大值
    //迭代:当前钢条段的价值 + 剩余右边钢条的价值
    //(这里因为下标从0开始,所以有-1)
        maxvalue = max(maxvalue, price[i - 1] + CutRod(price, length - i));
    }
    return maxvalue;
}
int main() {
   
   
钢条切割问题——动态规划 基本原理:将钢条从长度为1至N依次分隔成两部分,例如分成1和N-1,2和N-2等,分割完后左半部分价格已经确定,则只需要计算右半部分(例如N-1,N-2)长度的钢条价格,而这又是一个子问题,故想到用递归来解决自顶向下递归代码实现如下int CutRod(int p[],int n){ if(n==0) return 0; int q=-1; for(int i=0;i&lt;n... 阅读详情

相关推荐

算法复习——动态规划篇之钢条切割问题

算法复习——动态规划篇之钢条切割问题 以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 钢铁切割: ​ 现有一段长度为10的钢条,可以零成本将其切割为多段长度更小钢条。 ​ 比如有以下几种切割方案: ​ 问题是怎么合理切割,使总收益最大? 2. 问题定义 钢条切割问题(Rod Cutting Problem) 输入: 钢条长度nnn 价格表p[l](1≤l≤n)p[l](1 \leq l \leq n)p[l](1≤l≤n):表示长度为ll

NickHan_cs的博客 3090

Python 算法入门教程:动态规划之钢条切割问题

钢条切割问题,主要讲解了什么是钢条切割问题,如何利用动态规划算法解决钢条切割问题,给出了钢条切割问题的实现伪代码并进行分析,并用 Java 语言进行了伪代码实现,帮助大家通过钢条切割问题更好的理解动态规划算法思想的应用。我们来考虑现实生活中的一个实际应用场景,某个钢材公司购买长钢条,将其切割为短钢条出售,其中切割过程本身不考虑成本,公司管理层想知道最赚钱的钢材切割方案。

win19970108018的博客 755

Python实现动态规划切割钢条问题

该题目来自《算法导论》书中动态规划一章的实例,书上用的是伪代码实现。 切割钢条问题的描述: http://www.cnblogs.com/mengwang024/p/4342796.html 以下是我的python实现: price = [0, 1, 5, 8, 9, 10, 14, 17, 20, 24, 30] cut_point = [] def cut_rod(length)

micheal_yejinglin的专栏 2963

钢条切割问题(动态规划)

钢条切割问题(动态规划)

qq_52042398的博客 1087

动态规划 -- 钢条切割问题

给定一段长度为n英寸的钢条和一个价格表p,求切割钢条方案(钢条的长度均为整英寸),使得销售收益r最大。 我们可以计算出长度为n英寸的钢条共有2的(n-1)次方种不同的切割方案。 为解决规模为n的原问题,我们可以这样考虑。先求解形式完全一样,但规模更小的子问题。我们将钢条左边切割下长度为i的一段(i的取值范围是[1, n]),然后只对右边剩下的长度为n-i的一段继续进行切割(递归求解)。即问题的分...

AquamanTrident的博客 733

钢条切割问题:动态规划算法的典型应用

在工业生产和物流管理中,钢条切割问题是一个常见的优化问题。企业在购买长钢条并将其切割为短钢条出售时,往往面临着如何切割以最大化利润的问题。这个问题不仅关系到企业的成本控制和利润最大化,也涉及到资源的有效利用和生产效率的提升。本文将介绍钢条切割问题的数学模型,以及如何运用动态规划算法来寻找最优的切割方案。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 2015

【算法-动态规划】钢条切割问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2万+

动态规划实战:钢条切割问题解析

在生产领域,材料切割是常见的优化问题之一,它不仅出现在制造业,还广泛存在于各种资源分配的情景中。钢条切割问题,就是一个经典的材料切割问题。它涉及到如何将一根长度为N的钢条,切割为若干段以获得最大利润的问题。这个看似简单的问题,实际上是资源优化的一个缩影,反映了在有限资源下如何通过合理分配达到最大效益的普遍问题。钢条切割问题的实际意义在于:提高材料利用率:通过科学的计算和优化,可以最大限度地减少原材料浪费,降低材料成本。增加企业利润。

weixin_42452924的博客 1179

记录——影刀RPA高级操作题(二)——使用影刀RPA内置包和”Xpath“获取数据,获取数据写入目标MySQL

【代码】记录——影刀RPA高级操作题(二)——使用影刀RPA内置包和”Xpath“获取数据,获取数据写入目标MySQL。

m0_74824002的博客 842

Agent框架系列:1-低代码智能体平台深度解析Dify、Coze、n8n

Dify、Coze 和 n8n 是三大主流低代码智能体平台,各有侧重。Dify 适合企业级 AI 应用,具备强大的 RAG 和知识库管理能力,技术栈为 Python + React。Coze 由字节推出,主打零代码和快速原型开发,集成 60+ 插件,极适合非技术用户。n8n 以工作流自动化和系统集成为核心,支持 400+ 外部应用,基于 Node.js + Vue,扩展性极强。选择建议:非技术团队选 Coze,AI 应用选 Dify,复杂自动化与集成选 n8n。可根据实际需求混合使用,最大化平台优势。

3081

步进电机原理及梯形加速算法

步进电机重理解与梯形加速算法

weixin_39912966的博客 1322

爱快路由(ikuai)多WAN口配置实战:提升网络带宽与稳定性

本文详细解析了爱快路由(ikuai)多WAN口配置的实战技巧,包括双线智能分流、毫秒级故障切换和带宽叠加利用等核心功能。通过七种配置方案和智能QoS策略,帮助企业提升网络带宽与稳定性,实现99.9%以上的高可用性。

weixin_30566063的博客 700

保姆级避坑指南:在Ubuntu 22.04上从零编译Autoware.universe(含ROS2 Humble和CUDA配置)

本文提供了一份详细的Autoware.universe编译指南,涵盖Ubuntu 22.04系统优化、ROS2 Humble安装避坑、CUDA配置及Demo运行技巧。通过分步操作和实战经验,帮助开发者高效完成环境搭建,避免常见错误,提升自动驾驶开发效率。

weixin_30642561的博客 347

学Simulink--基于多能源系统协同与能源互联网的电网系统场景实例:风光氢储一体化系统的能量管理与调度仿真

在全球“双碳”目标驱动下,高比例可再生能源并网成为电网发展的核心方向。然而,风电与光伏具有强随机性与间歇性,给电网稳定运行带来巨大挑战。风光氢储一体化系统(Wind-Solar-Hydrogen-Storage Integrated System)通过将可再生能源发电电解水制氢氢气储存与燃料电池发电有机结合,构建了一个长时储能与能量形态转换的闭环系统,是实现能源互联网与零碳电力系统的关键路径。✅平抑波动:氢储能可实现跨天、跨周储能✅能量转化:电→氢→电/热/交通燃料,实现多能互补✅长时储能。

amy_mhd的博客 1071

Ollama部署本地大模型详细教程

创建ModelfilePARAMETER num_gpu 50 # GPU 层卸载比例(0~100)场景是否推荐本地开发/测试 Agent✅ 强烈推荐内部知识库问答(RAG)✅ 推荐(配合 Pgvector)生产环境高并发服务⚠️ 谨慎(建议评估 vLLM / Triton)需要 Function Calling 的 Agent❌ 不推荐(改用 DashScope API)🔑核心价值Ollama 是“本地大模型的 Docker”——让开源模型像容器一样 easy to run。

我们的征途是星辰大海 2619

DJI O2协议物理层逆向工程解析:揭开无人机通信的神秘面纱

DJI的O2协议是其OcuSync传输技术的最新演进,应用于Mini 2、Mavic Air 2、Mavic Air 2s和Mavic 3等无人机模型。这种协议结合了多种先进无线通信技术,能够在远距离提供稳定可靠的低延迟连接。O2协议物理层(PHY)是OSI模型的最底层,负责在物理媒介上传输原始数据比特流。它定义了电气特性、调制方式、编码方案、数据传输速率和同步机制等。DJI O2协议的物理层逆向工程是一个复杂但极具价值的领域。

QQ_778132974的博客 2385

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 基于QT的学生信息管理系统软件开发
下一篇: QT之调用cmd并执行ping命令
puthon
博客等级 码龄11年 173粉丝 50原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值