[英]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
對之前,您的代碼會讀取兩個整數x
和capacity
。 但是,您的示例輸入文件在這些對之前只包含一個整數。 因此,您最終將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.