我有一个家庭作业的问题,我已经想了一段时间了,我一辈子都想不出来。
我有一张X*Y尺寸的床单,还有一组较小尺寸的图案,价格与它们相关我可以水平或垂直切割板材,我必须找到优化的切割模式,才能从板材中获得最大的利润。
据我所知应该有(x*y)(x+y+模式)递归操作。复杂性被认为是指数的。有人能解释一下原因吗?
我提出的伪代码如下:

Optimize( w, h ) {
best_price = 0
    for(Pattern p :  all patterns) {
        if ( p fits into this piece of cloth && p’s price > best price) {best_price = p’s price}
    }
    for (i = 1…n){
       L= Optimize( i, h );
       R= Optimize( w-i, h);
       if (L_price + R_price > best_price) { update best_price}
    }
    for (i = 1…n){
        T= Optimize( w, i );
        B= Optimize( w, h-i);
        if (T_price + B_price > best_price) { update best_price}
    }
return best_price;
}

最佳答案

递归情况是指数型的,因为您可以在开始时选择将纸张剪切为0到最大宽度英寸或0到最大高度英寸,然后选择剪切剩余的部分(递归)。
这个问题听起来有点有趣,因为它涉及两个维度。
http://www.radford.edu/~nokie/classes/360/dp-rod-cutting.html
是个很好的向导。读这本书应该能让你走上正轨,而不必明目张胆地回答你的家庭作业。
当递归时为什么它是指数的相关部分:

This recursive algorithm uses the formula above and is slow
Code
    -- price array p, length n
    Cut-Rod(p, n)
        if n = 0 then
            return 0
        end if
        q := MinInt
        for i in 1 .. n loop
            q = max(q, p(i) + Cut-Rod(p, n-i)
        end loop
        return q

Recursion tree (shows subproblems): 4/[3,2,1,0]//[2,1,0],[1,0],0//[1,0],0,0//0
Performance: Let T(n) = number of calls to Cut-Rod(x, n), for any x
T(0)=0
T(n)=1+∑i=1nT(n−i)=1+∑j=0n−1T(j)
Solution: T(n)=2n

07-26 09:34
查看更多