动态规划=递归式+重复子问题。 1、钢条切割问题 假设现在有一个长度为4的钢条,我们来看看对它切割有哪些可能,由上面的价格表可知,长度为4的不切的话价格是9,下面为几种切割方案: 下面这个表记录的是不同长度的时候,按照上面的切割价格表得到的价格最优解: 在思考问题的时候我们的一个原则是尽量少的重复思考相...
#动态规划 钢条切割问题p=[0,1,5,8,9,10,17,17,20,21,23,24,26,27,27,28,30,33,36,39,40]#价格表 长度是下标,卖对应的数值defcutting(p,n):ifn==0:return0#如果n=0直接返回0else:res=p[n]foriinrange(1,n-1):res=max(res,cutting(p,i)+cutting(p,n-i))#递归:比较在大于1的长度...
给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,...n),求切割方案,使得销售收入r()最大 2.问题分解 问题分解:将长度为n的钢条分解为左边一段和剩余部分,左边一段不再进行分割,剩余部分继续分割(子问题相同,递归处理) 3.动态转移方程 r(n)=max(p(i)+r(n-i)) 1<=i<=n 注意i不能取0 r(n)...
解法一有个问题,当钢条长度太长时,计算会很慢。因为会重复计算许多中间节点的长度最佳售价。例如长度为10的钢条,从左切可以是0-10、1-9、2-8、3-7...,要计算9的售价则又需要计算0-9、1-8、2-7、3-6...,可以看到长度为2、3等的钢条,其价格需要重复计算。 易知,长度为n的钢条,有2^n种切割方案,故...
动态规划有两种等价的实现方法(我们使用上面的钢条切割问题为例,实现这两种方法) 第一种方法是 带备忘的自顶向下法: 此方法依然是按照自然的递归形式编写过程,但过程中会保存每个子问题的解(通常保存在一个数组中)。当需要计算一个子问题的解时,过程首先检查是否已经保存过此解。如果是,则直接返回保存的值,从而节...
钢条切割问题还存在一种相似的但更为简单的递归求解方法:将钢条从左边切割下长度为i的一段,只对右边剩下的长度为n-i的一段继续进行切割,对左边的一段则不再进行切割。这样得到的公式为:rn=max(pi+rn-i), i∈[1,n]。这样原问题的最优解只包含一个相关子问题(右端剩余部分)的解,而不是两个 —— 这个...
动态规划:钢条切割问题 问题:Serling公司购买长钢条,将其切割为短钢条出售。不同的切割⽅案,收益是不同的,怎么切割才能有最⼤的收益呢?假设,切割⼯序本⾝没有成本⽀出。假定出售⼀段长度为i英⼨的钢条的价格为p i (i=1,2,…)。钢条的长度为n英⼨。如下给出⼀个价格表P。 给定...
问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大。 2. 思路 思考: 长度为n的钢条的不同切割方案有几种? 有2 n − 1 2^{n-1}2n−1种,因为有n − 1 n-1n−1个可以切割的地方,每个位置都有切与不切两种选择,所以是2 n − 1 2^{n-1}2n−1种,但是这种方法...
采用自底向上法(bottom-up method)来求解该问题,需要用一个列表来记录收益$r_n$,一个列表来记录切割方案,其Python代码如下: import time # 使用动态规划法(dynamic programming)解决钢条切割问题 # 钢条长度与对应的收益 length = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) profit = (1, 5, 8, 9, ...
动态规划篇:钢条切割问题 童咏昕 北京航空航天大学 计算机学院 中国大学MOOC北航《算法设计与分析》 问题背景 ⚫ 钢条切割 ⚫ 现有一段长度为10的钢条,可以零成本将其切割为多段长度更小钢条 钢条长度 0 1 2 3 4 5 6 7 8 9 10 价格 0 1 5 8 9 10 17 17 20 24 24 问题背景 ⚫ 钢条切割 ⚫...