动态规划:钢条切割问题

问题:

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]

 

上一篇:问题 H: a^b


下一篇:Android.mk 小结 和 手机分区