动态编程记忆切割杆修改

时间:2019-04-11 00:49:38

标签: java

我有一个程序,可以输出最大的收益,我可以使用递归的记忆算法来切割棒材。我正在尝试修改程序以返回削减的长度以及最大收入。我需要帮助确定需要对memoizedCutRodAux进行更改以返回q和s的帮助,并且我的printCutRod方法需要帮助。具体来说,我不理解“(r,s)= memoizedCutRod(p,n)”。谢谢您的帮助!

RodCutting类别:

public class RodCutting {

    public int memoizedCutRod(int[] p, int n){
        int[] r = new int[n+1];
        int[] s = new int[n+1];
        for (int i = 0; i < r.length; i++){
            r[i]=-1;
        }
        return memoizedCutRodAux(p,n,r,s);
    }

    public int memoizedCutRodAux(int[] p, int n, int[] r, int[] s){
        if(r[n]>0){
            return r[n];
        }
        int q;
        if(n==0){
            q=0;
        }
        else{
            q=0;
            for(int i=0;i<n;i++){
                q=Math.max(q, p[i]+memoizedCutRodAux(p,n-i-1,r, s));
                s[n] = i;
            }
        }
        r[n]=q;
        return q;
        //return q and s
    }

    public void printCutRod(int[] p, int n){
        //(r,s) = memoizedCutRod(p, n)
        //while (n > 0)
             //print s[n]
             //n = n-s[n]
    }

    public static void main(String[] args) {
        RodCutting rc =new RodCutting();
        int n = 10;
        int[] p = {1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
        for (int i = 1; i <= n; i++) {
            int rev = rc.memoizedCutRod(p, i);
            System.out.println("r" + i + " = " + rev + " from solution " + i );
            rc.printCutRod(p, i);
            System.out.println("-------------------");
        }
    }

我想在当前输出中增加削减的长度以最大化收益 对于我代码中的每次切割成本,r1 = 1 //不切割,r2 = 2 //不切割,r4为2 2,r5 = 2 3 //切割2并切割3。

r1 = 1来自解决方案1-//在此处添加1

r2 = 5 from solution 2-//在此处添加2

r3 =解决方案3中的8-//在此处添加3

r4 = 10 from solution 4-//在此处添加2 2

r5 =解决方案5中的13-//在此处添加2 3

r6 =解决方案6中的17-//在此处添加6

r7 =解决方案7中的18-//在此处添加1 6或2 2 3

r8 =解决方案8中的22-//在此处添加2 6

r9 =解决方案9中的25-//在此处添加3 6

r10 =解决方案10中的30-//在此处添加10

我希望这很清楚,可以提供一些指导。这一切在我脑海中都是有意义的; 0)

0 个答案:

没有答案