问题描述如下:
给定一段长度为 n 的钢条和一个价格表 pi (i = 1, 2, ..., n ),求切割钢条的方案,是的销售收益 r 最大。
朴素递归:
/*
朴素递归算法,计算当钢条长度为 n 时,计算最大收益
输入参数:
p:价格数组,长度为 i 的钢条的价格为 p[i]
n:钢条长度
返回值:
最大收益
*/
CUT-ROD( p, n )
if n == 0 // 递归结束的条件:钢条的长度为 0
return 0
q = -1 // 初始化价格为 0
for i = 1 to n // 计算钢条长度从 1 到 n 时的最大收益
q = max( q, p[i] + CUT-ROD( p, n - i ) ) // 递归计算
return q
采用朴素递归算法形成的递归调用树会重复求解子问题,导致效率低下
朴素递归的递归调用树:
带备忘的自顶向下算法:
/*
自顶向下算法,计算当钢条长度为 n 时,计算最大收益
输入参