繁体   English   中英

我的背包有什么问题吗

[英]Is there something wrong with my knapsack

我有一个背包问题,其中,我的约束是

  1. 不能超过最大金额
  2. 成本和权重的输入数组,即物料i的成本和物料i的权重
  3. 最大化重量。

我的输入和输出应该具有以下性质

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM