解决背包动态规划调试

Posted

技术标签:

【中文标题】解决背包动态规划调试【英文标题】:solving knapsack dynamic programming debugging 【发布时间】:2014-07-29 12:01:29 【问题描述】:

我尝试自己解决经典的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】:

你的错误是这一行

 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,加上每一步中最后一个value[i],所以你的结果是双倍的

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

public static int c(int currentElement,int currentReamainder)

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

    for(int i=currentElement;i<weight.length;i++)
        if(currentReamainder<weight[i]) break;//This line is not valid, only when the weight array is sorted(ascending order)
        int val = Math.max(value[i]+c(i+1,currentReamainder-weight[i]),c(i+1,currentReamainder));
        p = Math.max(val, p);
    

    return p;

【讨论】:

我的错。知道了。非常感谢。 我的回答仍然不正确。它给出 108 是正确答案的两倍。 已编辑为新问题。谢谢。 哦,我会回滚。谢谢。 得到你的答案谢谢。

以上是关于解决背包动态规划调试的主要内容,如果未能解决你的问题,请参考以下文章

用动态规划求解分数背包问题

动态规划解决背包问题

Java采用动态规划思想解决背包问题

背包动态规划解决方案的时间复杂度

基础一叶知秋,从背包问题到动态规划

动态规划,0/1背包,完全背包