Неверный alloc выброшен при использовании вектора для алгоритма ранца

В настоящее время я пробую структуры данных и алгоритмы с помощью комбинации онлайн-ресурсов. Для одного из них я попытался решить знаменитую задачу о рюкзаке с помощью жадного алгоритма.
Я сортирую веса и значения задачи в порядке убывания перед циклом, чтобы повысить производительность.
Когда я запускаю код, я получаю ошибку 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;
}

заранее спасибо


person Anonymous    schedule 26.03.2016    source источник
comment
Чтобы создать вектор размера values.size(), инициализированный нулями, вы можете использовать vector<int> ourKnapsack(values.size(), 0);. Нет необходимости использовать for.   -  person robsn    schedule 26.03.2016
comment
Если вы хотите использовать for, тогда используйте i < values.size() вместо i < ourKnapsack.size() в качестве условия, потому что последнее растет вместе с вашими возвратами, и ourKnabsack[i] = 0 вместо push_back внутри цикла. В любом случае лучше использовать не for, а соответствующий векторный конструктор.   -  person robsn    schedule 26.03.2016
comment
Как я и предсказывал, какая-то глупость. Большое тебе спасибо. Это первый раз, когда я систематически программировал что-либо на C++ за год, и мой опыт программирования дилетантский и в лучшем случае кричит как самоучка, поэтому, пожалуйста, простите меня. Теперь я получаю ошибку исключения с плавающей запятой, но я думаю, что знаю, откуда это происходит. Придется пока взять небольшой перерыв на 15-20 минут, но я посмотрю, смогу ли я это исправить сразу после, а если нет, то спрошу.   -  person Anonymous    schedule 26.03.2016
comment
Не принижай себя. Я зарабатываю на жизнь программированием уже 35 лет. Я до сих пор совершаю подобные глупые ошибки. Единственная разница в том, что обычно я могу найти их сам (используйте ваш отладчик).   -  person Martin Bonner supports Monica    schedule 26.03.2016
comment
Просто чтобы уточнить правила этикета: если у вас другая проблема, пожалуйста, задайте отдельный вопрос.   -  person Martin Bonner supports Monica    schedule 26.03.2016
comment
@Anonymous Мой ответ решил твою проблему?   -  person Anmol Singh Jaggi    schedule 31.03.2016


Ответы (1)


for (size_t i = 0; i < ourKnapsack.size(); i++)
  ourKnapsack.push_back(0); //fill with zeroes

Это войдет в бесконечный цикл.

person Anmol Singh Jaggi    schedule 26.03.2016