为什么会出现分段错误(核心转储)错误?
我没有做太多尝试,我知道代码可以工作,但是stepik显示了这些错误
#include <iostream>
using namespace std;
int maximum(int a, int b)
{
return (a > b) ? a : b;
}
int knapSackValue(int capacity, int weight[], int value[], int x)
{
int i, w;
int Kn[x + 1][capacity + 1];
for (i = 0; i <= x; i++) {
for (w = 0; w <= capacity; w++) {
if (i == 0 || w == 0)
Kn[i][w] = 0;
else if (weight[i - 1] <= w)
Kn[i][w] =
maximum(value[i - 1] + Kn[i - 1][w - weight[i - 1]], Kn[i - 1][w]);
else
Kn[i][w] = Kn[i - 1][w];
}
}
return Kn[x][capacity];
}
int main()
{
int x;
cin >> x;
int capacity;
cin >> capacity;
int value[x];
int weight[x];
for (int i = 0; i < x; i++) {
cin >> value[i];
cin >> weight[i];
}
cout << knapSackValue(capacity, weight, value, x);
return 0;
}
编写一个算法,该算法使用动态程序来找到背包问题的解决方案。 输入的是背包的容量,然后是值和权重表的每一行。
输出是可以放入背包的物品的最终最大值。 样本输入1:
11
1 1
6 2
18 5
22 6
28 7
示例输出1:
40
答案 0 :(得分:0)
在开始读取x
/ capacity
对之前,您的代码将读取两个整数value
和weight
。但是,样本输入文件在这些对之前仅包含一个整数。因此,您最终将1读入capacity
,1读入value[0]
,6读入weight[0]
,2读入value[1]
,18读入weight[1]
,依此类推。特别是,weight[4]
根本不会初始化。
因此,当i=5
中的knapSackValue
引用了Kn[i - 1][w - weight[i - 1]]
时,则weight[i - 1]
包含一个垃圾值,并且w - weight[i - 1]
超出了索引范围进入Kn[i - 1]
。
您的代码或输入文件错误。
答案 1 :(得分:0)
重复检查您的问题,尤其是示例数据。例如。 "Sample Input 1:"
看起来很可疑(可能只是换行符出现在我的屏幕上的地方)。
C ++标准不支持以下声明:
int value[x];
int weight[x];
这同样适用于:
int Kn[x + 1][capacity + 1];
为什么? 可变长度数组(VLA)不属于C ++标准,仅作为非标准编译器扩展提供。
此外,您尝试返回Kn
,它声明为knapSackValue()
的本地变量,并且在函数返回后不再存在。
取决于您对1
中的"Sample Input 1:"
是数据的一部分还是它的含义(例如,这是示例1)的回答,我可以进一步评论。另外,如果此数据确实是“ 1号样品”,请参阅Nate Eldridge的答案。