文字参考算法导论第十五章
问题描述:不同长度的钢条,具有不同的价值,而切割工序没有成本支出,公司管理层希望知道最佳切割方案,假定钢条的长度均为整数:用数组v[I]表示钢条长度为I所具有的价值v[] = {0,1,5,8,9,10,17,17,20,24,30};用r[I]表示长度为I的钢条能获取的最大价值,通过观察可以知道,
r[1] = 1(无切割),
r[2] = 2(无切割),
r[3] = 3(无切割),
r[4] = 10(r[4] = r[2]+r[2],切割成两段长度为2的钢条),
r[5] = 13(r[5] = r[2]+r[3],切割成长度为2和3的钢条),
r[6] = 17(无切割),r[7] = 18(r[7] = r[1]+r[6]或r[2]+r[2]+r[3]),
r[8] =22(r[8] = r[6]+r[2])
,r[9] = 25(r[9] = r[3]+r[6])
,r[10]=30(无切割),
更一般的,我们可以用更简短的钢条的最优切割收益来描述它:
r[n] = max(v[n],r[1]+r[n-1],r[2]+r[n-2],...,r[n-1]+r[1]),
首先将钢条切割成长度为I和n-I的两段,接着求哪种方案获得最优,我们必须考察所有可能的I,选取其中收益最大者,如果不做任何切割收益最大,那么选取不切割的价值。注意到,为了求解规模为n的元问题,我们先求解形式完全一样,但规模更小的子问题。首次切割后,将两段钢条看成是两个独立问题的实例。通过组合两个相关子问题的最优解,并在所有可能的两段切割方案中选取组合收益最大者,构成原问题的解,我们称其满足最优子结构,问题的最优子解由相关子问题的最优解组合而成,而这些子问题可以独立求解。
第二种求解思路:我们将钢条从左边切下长度为I的一段,只对右边剩下的长度为n-I的一段继续切割(递归求解),即问题的分解方式为:将长度为n的钢条分解为左边开始一段,以及剩余部分继续分解的结果。
#in