解决背包动态编程调试问题

时间:2014-07-29 12:01:29

标签: algorithm recursion dynamic-programming knapsack-problem

我试图自己解决经典knapsap problem。但我得到了错误的答案108。你能帮我弄清楚我做错了什么。我在这里使用recursion

重量限制为10

答案是5 + 3 + 2 ==> 25 + 15 + 14 = 54

public class KnapSack {
public static int[] weight={6,5,4,3,2};
public static int[] value={12,25,24,15,14};

public static void main(String[] args) {
    System.out.println(c(0,0,10));
}

public static int c(int currentElement,int currentValue,int currentReamainder){

    int p = 0;
    if(currentReamainder<=0) return currentValue;

    for(int i=currentElement;i<weight.length;i++){
        if(currentReamainder<weight[i]) return currentValue;
        p = Math.max(value[i]+c(i+1,currentValue+value[i],currentReamainder-weight[i]),c(i+1,currentValue,currentReamainder))
    }

    return p;
}

}

更新 如何打印最佳解决方案的权重?

1 个答案:

答案 0 :(得分:1)

您的错误就是这一行

 p=Math.max(value[i]+c(i+1,currentValue+value[i],currentReamainder-weight[i]),c(i+1,currentValue,currentReamainder));

应该是

 int val = Math.max(value[i]+c(i+1,currentValue+value[i],currentReamainder-weight[i]),c(i+1,currentValue,currentReamainder));
 p = Math.max(val, p);

最后一个错误是当你同时更新currentValue并返回p时,想象最后一次调用,当函数返回currentValue时加上最后一个{{1}在每一步中,所以你的结果是双重

所以,你的函数应该是(注意我已经删除了value[i]参数,这是不必要的):

currentValue