В настоящее время я пробую структуры данных и алгоритмы с помощью комбинации онлайн-ресурсов. Для одного из них я попытался решить знаменитую задачу о рюкзаке с помощью жадного алгоритма.
Я сортирую веса и значения задачи в порядке убывания перед циклом, чтобы повысить производительность.
Когда я запускаю код, я получаю ошибку bad_alloc. Означает ли это, что я просто не выделяю память, которая мне нужна? Я искал решение, но пока ничего не помогло, так как я не выполняю явный доступ к памяти с «новым» идентификатором.
Вот код:
#include <iostream>
#include <vector>
#include <algorithm>
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 weights
sort(values.begin(),weights.end(), decreaseSort); //sort values
vector<int> ourKnapsack(values.size()); //set Knapsack to n elements
for (size_t i = 0; i < ourKnapsack.size(); i++)
ourKnapsack.push_back(0); //fill with zeroes
double totalValue = 0.0; //total worth
int ourInput = 0; //what we are putting in
for (size_t j = 0; j < ourKnapsack.size(); j++){
double unitValue = values.at(j)/weights.at(j); //ratio of value to weight for specific item
if (capacity == 0)
return totalValue; //end program, return value
if (weights.at(j) < capacity){
ourInput = weights.at(j); //if we have room, fill with the weight
}
else {
ourInput = capacity; //fill the rest of the pack
}
totalValue = totalValue * (ourInput * unitValue); //update totalValue
weights.at(j)-=ourInput; //subtract weight by what we put in
ourKnapsack.at(j)+=ourInput; //update knapsack element
capacity-=ourInput; //shrink capacity
}
return totalValue;
}
int main() {
int n = 3; //test case, 3 items, capacity of 50
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; //should return optimal value
return 0;
}
заранее спасибо
values.size()
, инициализированный нулями, вы можете использоватьvector<int> ourKnapsack(values.size(), 0);
. Нет необходимости использоватьfor
. - person robsn   schedule 26.03.2016for
, тогда используйтеi < values.size()
вместоi < ourKnapsack.size()
в качестве условия, потому что последнее растет вместе с вашими возвратами, иourKnabsack[i] = 0
вместо push_back внутри цикла. В любом случае лучше использовать не for, а соответствующий векторный конструктор. - person robsn   schedule 26.03.2016