问题:
Serling公司购买长钢条,将其切割为短钢条出售。不同的切割方案,收益是不同的,怎么切割才能有最大的收益呢?假设,切割工序本身没有成本支出。 假定出售一段长度为i英寸的钢条的价格为p i (i=1,2,…)。钢条的长度为n英寸。如下给出一个价格表P。
给定一段长度为n英寸的钢条和一个价格表P,求切割钢条方案,使得销售收益 rn 最大。(如果长度为n英寸的钢条的价格p n 足够大,则可能完全不需要切割,出售整条钢条是最好的收益)
自顶向下动态规划算法:
1 public static int buttom_up_cut(int[] p) { 2 int[] r = new int[p.length + 1]; 3 for (int i = 1; i <= p.length; i++) { 4 int q = -1; 5 //① 6 for (int j = 1; j <= i; j++) 7 q = Math.max(q, p[j - 1] + r[i - j]); 8 r[i] = q; 9 } 10 return r[p.length]; 11 }
为什么长度为i时的最大收益 r[i] 可以通过注释①处的循环来求呢?
假设长度为i时钢条被分割为x段{m1,m2,m3,...,mx}可得最大收益 r[i] ,
取出其中一段mk,则最大收益可表示为
r[i] = p[mk] + r[i - mk]
如果r[i - mk] 不是长度为 i - mk 时的最大收益的话,则r[i]是长度为i时的最大收益也就不成立,所以最大收益r[i]一定可以表示成单独切出一段的价格p[mk] 加上余下长度的最大收益 r[i - mk]