背包动态编程

时间:2012-04-17 07:51:08

标签: java dynamic-programming knapsack-problem

这是典型的需要动态编程的背包问题,并且对物品供应没有限制。我一直在为我的班级工作,我试着用这个算法玩几个小时,但我还没有到达那里。

public static int fitBackPack(int[] W, int[] V, int T){
    int[] Opt = new int[T+1];
    Opt[0]=0;
    for (int i=1; i<=T; i++){
        int localMax=0;
        int globalMax=0;
        for (int j=0; j<W.length; j++){
            if (W[j]<=i){
                localMax = (T%W[j]<=W[j]) ?  V[j] : V[j]+Opt[T-W[j]];
                globalMax = (localMax>=globalMax) ? localMax : globalMax;
            }
        }
        Opt[i]=globalMax;
    }
    //debugging purposes
    for (int k=0; k<Opt.length; k++){
        System.out.println("Opt["+k+"] = "+Opt[k]);
    }
    return Opt[T];
}

该方法应该采用W和V的排序数组,分别包含项目的权重和值,以及表示最大权重的整数T.对于我的输出,直到T = 21的所有内容都可以工作,然而,之后它似乎就像一个贪婪的算法,这完全不是我所希望的。任何提示都将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:0)

提示: (x%y&lt; = y)== true

每时每刻都有一个真实表通过您的条件和测试用例将帮助您找到这些。 最好还是为一般用法和边缘情况设置一些自动化测试。

答案 1 :(得分:0)

由于你的算法就像一个贪婪的算法,你的问题可能在于localMax的计算(因为贪婪的算法寻找最高的本地值)。通过查看代码,您似乎以错误的方式获取localMax。提示,请参阅Math.max()函数。