簡體   English   中英

為什么分段錯誤(核心轉儲)?

[英]Why segmentation fault(core dumped)?

為什么我會收到分段錯誤(核心轉儲)錯誤?

我沒有嘗試過,我知道代碼有效,但是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

在開始讀取value / weight對之前,您的代碼會讀取兩個整數xcapacity 但是,您的示例輸入文件在這些對之前只包含一個整數。 因此,您最終將1讀入capacity ,將1讀入value[0] ,將6讀入weight[0] ,將2讀入value[1] ,將18讀入weight[1] ,依此類推。 特別是, weight[4]根本不會被初始化。

因此,當knapSackValue i=5 ,並且您引用Kn[i - 1][w - weight[i - 1]]weight[i - 1]包含垃圾值,而w - weight[i - 1]是超出范圍作為Kn[i - 1]的索引。

您的代碼或輸入文件是錯誤的。

Doube-檢查您的問題,尤其是示例數據。 例如"Sample Input 1:"看起來很可疑(這可能就是換行符落在我的屏幕上的地方)。

C ++標准不支持以下聲明:

int value[x];
int weight[x];

這同樣適用於:

int Kn[x + 1][capacity + 1];

為什么? 可變長度數組 (VLA)不是C ++標准的一部分,僅作為非標准編譯器擴展提供。

此外,您嘗試返回Kn ,它被聲明為knapSackValue()本地,並且在函數返回后不再存在。

根據您對"Sample Input 1:"1是否是數據的一部分或者它的含義(例如,這是1號樣本)的答案,我可以進一步評論。 另外,如果這個數據真的是“1號樣本”,請參閱Nate Eldridge的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM