解决背包动态规划调试
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 是正确答案的两倍。 已编辑为新问题。谢谢。 哦,我会回滚。谢谢。 得到你的答案谢谢。以上是关于解决背包动态规划调试的主要内容,如果未能解决你的问题,请参考以下文章