算法导论--第15章 动态规划--钢条切割

2024-05-24 22:32

本文主要是介绍算法导论--第15章 动态规划--钢条切割,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法导论

--第15章 动态规划

动态规划:通过组合子问题的解来求解原问题,应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。

设计动态规划算法的步骤:

①   刻画一个最优解的结构特征。

②   递归定义最优解的值。

③   计算最优解的值,通常采用自底向上的方法。

④   利用计算处的信息构造一个最优解。

 

 

15.1 钢条切割

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

若钢条的长度为i,则钢条的价格为Pi,如何对给定长度的钢条进行切割能得到最大收益?

长度i    1    2    3   4     5      6      7     8      9      10

价格Pi    1    5    8   9     10    17   17   20    14    30

 

i = 1时,钢条不可切割,r[1]= 1

i = 2时,钢条可分割为1+ 1,其价格为2。若不分割(0 + 2),价格为5。即r[2] = 5

i = 3时,钢条可分割为0+ 3, 1 + 2。r[3] = 8

同理可得:

r[4] = 10(2+ 2)

r[5] = 13(2+ 3)

r[6] = 17(0+ 6)

r[7] = 18(1+ 6或4+ 3=> 2 + 2 + 3

.......

 

我们可以发现,长度为7时,将其切割为长度4与长度3的钢条,并对两个钢条分别求最优解:长度4的最优解为r[4] = 10(2 + 2),长度3的最优解为r[3] = 8,即可得r[7] =r[4]+ r[3] =>原问题的最优解等于子问题的最优解之和的最大值

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

因此,在计算r[i]时,所求值即为r[0] +r[i],r[1]+ r[i- 1],r[2]+ r[i- 2],...  ,r[i- 1] +r[1] 之间的最大值,而在动态规划中,r[0]——r[i - 1]的值在计算r[i]之前已经保存好了,进行少量的运算便能取得最优结果。

codes:

#include<iostream>
#include<cstring>
using namespace std;
int p[1000],r[1000],s[1000];
void cut_rod(int* a,int b)
{r[0]=0;for(int i=1;i<=b;i++){int q=-1e8;for(int j=1;j<=i;j++){if(q<(a[j]+r[i-j])){q=a[j]+r[i-j];s[i]=j;r[i]=q;}}}cout<<r[b]<<endl<<s[b]<<endl;
}
int main()
{int n;cin>>n;memset(p,0,sizeof(p));memset(r,0,sizeof(r));memset(s,0,sizeof(s));for(int i=1;i<=n;i++)cin>>p[i];cut_rod(p,n);return 0;
}


这篇关于算法导论--第15章 动态规划--钢条切割的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999715

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template