为什么分段错误(核心已转储)?

时间:2019-04-24 03:03:12

标签: c++

为什么会出现分段错误(核心转储)错误?

我没有做太多尝试,我知道代码可以工作,但是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

2 个答案:

答案 0 :(得分:0)

在开始读取x / capacity对之前,您的代码将读取两个整数valueweight。但是,样本输入文件在这些对之前仅包含一个整数。因此,您最终将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的答案。