我的背包有问题吗?

时间:2014-01-26 07:10:55

标签: c algorithm dynamic-programming knapsack-problem

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

  1. 不能超过最高金额
  2. 输入成本和重量的数组,即项目i的成本和项目i的重量
  3. 最大化重量。
  4. 我的输入和输出应具有以下性质

      

    3 4 // 3是不同商品的数量,4是最大金额,接下来的三行显示成本和重量

         

    2 1 //成本和重量

         

    2 2 //成本和重量

         

    3 5 //成本和重量

    以上输出为5

    以下是我的解决方案,codechef说我得到了错误的答案,任何人都可以帮助我,可能的原因是什么?

    除此之外,我的方法是否有问题,我可以做得更好吗?我从here查找了解决方案,在我看来,我的大部分都是正确的。

    感谢。

    #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);
    }
    

1 个答案:

答案 0 :(得分:1)

代码中的问题似乎是: -

 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];
}

仅在计算if maxMoney大于或等于item的成本时进行检查,以便有可能包含该案例将具有零值的项目。

注意: - 不要使用零作为记忆的哨兵值尝试负数(-1),因为可能有零成本但是不可能是negetive。