其实采用非递归的方式实现斐波那契数列就体现了动态规划(DP)的思想。动态规划=递归式+重复子问题。 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]#价格表 长度是下标,卖对应的数值def cutting(p,n): if n==0: return 0#如果n=0直接返回0 else: res=p[n] for i in range(1,n-1): res=max(res,cutting(p,i)+cutting(p,n-i))#递归:...
动态规划通常用来求解最优化问题,适用问题通常有以下两个特点: 1.具有最优子结构性质:问题的最优解由相关子问题的最优解组合而成。 2.有大量的重叠子问题。 二、钢条切割问题 问题:Serling公司购买长钢条,将其切割为短钢条出售。假设切割工序没有成本,不同长度的钢条的售价如下: 图一 钢条价格表 那么钢条切割...
长度为n米的钢条,需要切割成x断来贩卖。假设没有切割成本,且每种长度能够销售的价格是一个确定的值(例如长度1米可以卖1元,长度2米可以卖5元,长度3米可以卖6元等)。 现在假定已知每种长度可以销售的价格,求长度为n米的钢条切割后,可以销售得到的最大利润。 二、分析 对于任意长度为i米的钢条,要获得最大价值...
长度为n英寸的钢条共有2n-1种不同的切割方案,因为在距离钢条左端i(i=1,2,…n)英寸处,总是可以选择切割或不切割。 将钢条切割为长度分别为i1,i2...ik的小段得到的最大收益为rn=pi1+pi2+...+pik,则对于n>=1,rn=max(pn,r1+rn-1,r2+rn-2,...,rn-1+r1)—— pn对应不切割,对于每个i=1,2...
动态规划有两种等价的实现方法(我们使用上面的钢条切割问题为例,实现这两种方法) 第一种方法是 带备忘的自顶向下法: 此方法依然是按照自然的递归形式编写过程,但过程中会保存每个子问题的解(通常保存在一个数组中)。当需要计算一个子问题的解时,过程首先检查是否已经保存过此解。如果是,则直接返回保存的值,从而节...
动态规划-钢条切割问题 Description:The rod-cutting problem is the following. Given a rod of length n inches and a table of prices p i for i D 1,2,…,n, determine the maximum revenue rn obtainable by cutting up the rod and selling the pieces. Note that if the price pn for a rod...
动态规划:钢条切割问题 问题: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, ...