我的背包有问题吗
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),因为可能有零成本,但负数是不可能的。
【讨论】:
以上是关于我的背包有问题吗的主要内容,如果未能解决你的问题,请参考以下文章