我试图自己解决经典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;
}
}
更新 如何打印最佳解决方案的权重?
答案 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