分割木棒问题(Cutting a Rod)--动态规划

给定一根长度为n英寸的木棒,并且给出一组对应长度为1到n的价格表,如何切割木棒使得切割后能够获得最大的出售金额。例如,如果杆的长度为8,并且不同的长度对应的价格如下所示,则最大可获得值为22(将长度2和6切成两段)
length   | 1	2	3	4	5	6	7	8
-------------------------------------------
price    | 1	5	8	9	10	17	17	20

如果价格变为如下所示,则获得的最大值为24(即切成8段,每段为1)

length   | 1	2	3	4	5	6	7	8
-------------------------------------------
price    | 3	5	8	9	10	17	17	20

可以采用求出所有可能的切割方式并且计算每种方式的值来求出最大值,但是这样的方法时间复杂度是指数型的,我们考虑动态规划的方法。我们可以通过在不同位置进行切割并比较切割后获得的价格来获得最佳价格。 我们可以为切割后获得的长度递归调用相同的函数。

令cutRod(n)为长度为n的木棒的切割后能获得的最大值。
c u r R o d ( n ) = m a x ( p r i c e [ i ] + c u t R o d ( n − i − 1 ) ) curRod(n) = max(price[i] + cutRod(n-i-1)) curRod(n)=max(price[i]+cutRod(ni1)) for all i in { 1 , 2 , . . . , n − 1 } \left \{ 1,2,...,n-1 \right \} {1,2,...,n1}
以下是Rod Cutting问题的简单递归实现.

class RodCutting 
{ 
    public int cutRod(int price[], int n) 
    { 
        if (n <= 0) 
            return 0; 
        int max_val = Integer.MIN_VALUE; 
        for (int i = 0; i<n; i++) 
            max_val = Math.max(max_val,price[i] + cutRod(price, n-i-1)); 
        return max_val; 
    } 

你可能感兴趣的:(分割木棒问题(Cutting a Rod)--动态规划)