[英]Is there something wrong with my knapsack
我有一个背包问题,其中,我的约束是
我的输入和输出应该具有以下性质
3 4 // 3是不同项目的数量,4是最大金额,接下来的三行显示成本和重量
2 1 //成本和重量
2 2 //成本和重量
3 5 //成本和重量
以上的输出将是5
以下是我的解决方案, codechef
表示我得到了错误的答案,有人可以帮助我吗?
除此之外,我的方法是否有问题,我可以做得更好。 我从这里查找解决方案, 在我看来,我大部分都正确。
谢谢。
#include<stdio.h>
#include<stdlib.h>
int max(int a,int b){
return a > b ? a : b;
}
int findOutput(int maxMoney,int index,int numOfItems,int *cost,int *weight, int **output){
if(index >= numOfItems)
return 0;
if(maxMoney < cost[index])
return 0;
if(output[maxMoney][index] != 0)
return output[maxMoney][index];
int a = findOutput( maxMoney-cost[index],index+1,numOfItems,cost,weight,output) + weight[index];
int b = findOutput(maxMoney,index+1,numOfItems,cost,weight,output);
output[maxMoney][index] = max(a,b);
return output[maxMoney][index];
}
int main(){
int outputFinal = findOutput(maxMoney,0,numOfItems,cost,weight,output);
}
代码中的问题似乎是:-
if(maxMoney < cost[index])
return 0;
在这里,您返回的是当前项目之后的项目都无法放入背包,但是可能有一个项目的成本小于maxMoney
。
删除上面的声明并进行以下修改:
int findOutput(int maxMoney,int index,int numOfItems,int *cost,int *weight, int **output){
if(index >= numOfItems)
return 0;
if(output[maxMoney][index] != -1)
return output[maxMoney][index];
int a = 0;
if(maxMoney >= cost[index]) {
a = findOutput( maxMoney-cost[index],index+1,numOfItems,cost,weight,output) + weight[index]; }
int b = findOutput(maxMoney,index+1,numOfItems,cost,weight,output);
output[maxMoney][index] = max(a,b);
return output[maxMoney][index];
}
仅在计算maxMoney是否大于或等于物料成本时检查,以便有机会包括物料,否则情况将为零。
注意:-不要将零用作记忆的标记值,请尝试使用负数(-1),因为可能会有零成本,但无法进行取整。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.