【发布时间】:2016-03-27 01:55:05
【问题描述】:
对于背包问题的贪心算法,我在以下代码中遇到分段错误。尽管我见过它们,但我以前从未成功解决过分段错误,因此我将不胜感激。
我在运行调试器时收到的消息是没有“malloc.c”。当我运行 valgrind 时,我得到一个“4 号大小的无效读取”。在这与错误的性质之间,我猜我正在尝试访问一个不存在的向量元素。但是我已经尝试了所有我能想到的方法来确保循环在遍历向量时不会超出其界限。
(我在没有使用基于 C++11 范围的 for 循环的情况下完成了此操作,但仍然得到相同的错误。我为 for 循环的参数选择什么似乎并不重要,它仍然会抛出一个分割错误。)
提前致谢。
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdlib.h>
using namespace std;
bool decreaseSort(int a, int b)
{
return a > b; //sort by decreasing value for better performance
}
double get_optimal_value(int capacity, vector<int> weights, vector<int> values) {
sort(weights.begin(),weights.end(), decreaseSort);
sort(values.begin(),weights.end(), decreaseSort);
vector<int> ourKnapsack(values.size(), 0);
double totalValue = 0.0;
int ourInput = 0;
for (auto i : ourKnapsack){
int ourValue = values.at(i);
int ourWeight = weights.at(i);
double unitValue = (double)ourValue/ourWeight;
if (capacity == 0)
return totalValue;
if (weights.at(i) < capacity){
ourInput = weights.at(i);
}
else {
ourInput = capacity;
}
totalValue = totalValue * (ourInput * unitValue);
weights.at(i)-=ourInput;
ourKnapsack.at(i)+=ourInput;
capacity-=ourInput;
}
return totalValue;
}
int main() {
int n = 3;
int capacity = 50;
vector<int> values(n);
values = {60,100,120};
vector<int> weights(n);
weights = {20,50,30};
double optimal_value = get_optimal_value(capacity, weights, values);
std::cout.precision(10);
std::cout << optimal_value << std::endl;
return 0;
}
【问题讨论】:
-
我完全专注于处理向量和循环的代码,因为我看到了“分段”这个词,但忽略了排序...谢谢。
-
这就是“未定义行为”的意思。这并不意味着“立即出现分段错误”。这意味着“从现在开始,任何事情都可能发生”。立即出现分段错误是一种可能性。代码一瘸一拐,一段时间,然后爆炸,也是另一种可能性,也完全限定为“未定义的行为”。欢迎使用 C++。
标签: c++ c++11 vector segmentation-fault malloc