我的背包有问题吗

Posted

技术标签:

【中文标题】我的背包有问题吗【英文标题】:Is there something wrong with my knapsack 【发布时间】:2014-01-26 07:10:55 【问题描述】:

我有一个背包类问题,我的限制是

    不能超过最大金额 成本和重量的输入数组,即项目 i 的成本和项目 i 的重量 最大化重量。

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

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

【问题讨论】:

如果您的手动测试产生错误的结果,您应该调试并修复您的算法。如果您的测试产生了预期的答案,那么您应该考虑可能导致错误答案的关键测试用例。 @Desolator 是的,但我做得对吗?因为我一直对背包问题感到害怕,我想知道我是否走在正确的轨道上?谢谢。 @Kraken 我不知道你为什么用 C 等命令式语言递归而不是迭代。有什么特殊原因吗? @amit 我不明白吗?使用递归有什么问题?我认为您可以使用递归或迭代,而不必担心太多。 (由于函数调用,递归会花费更多时间,但我猜就是这样?) @Kraken 没有错——只是通常不是这样。在命令式语言中,通常首选迭代解决方案,除非有充分的理由使用递归(更短/更易读的代码)——但这实际上不是必须的。只是想知道你为什么在这里选择递归而不是迭代。 【参考方案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];

仅在计算 a 时检查 maxMoney 是否大于或等于项目成本,以便有机会包含该项目,否则该案例的价值为零。

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

【讨论】:

以上是关于我的背包有问题吗的主要内容,如果未能解决你的问题,请参考以下文章

dp 的背包问题让我的答案错误

背包动态规划输入

我的背包递归解决方案可以改进吗?

0/1 计划中的背包

可以使用指定重量的背包问题

求大神翻译这个图片,是我的世界背包编辑器,但是可以在服务器里用的,翻译好了谁要我可以送他!