Блог пользователя mohalllka

Автор mohalllka, история, 9 лет назад, По-русски

Привет! Помогите, пожалуйста, решить задачу на ДП с informatics Задача называется "Банкомат", свое решение прикладываю ссылкой на пастебин

SOURCE CODE

Прошу без суровой критики, т.к. я знаю о том, на сколько ужасен мой код. Если кто может подсказать в чем ошибка и прочее — буду благодарен!

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Рюкзак неправильно написал.
Прочитай о нем где нибудь
Плюс ты хранишь ответ в каждой ячейке, а это возможно будет превышение ограничения по времени, лучше восстанавливай ответ по массиву, типа так:

//находим рюкзаком res[i] = минимальное количество ходов чтобы взять i
    for(int i=0; i<n; i++){
        res[arr[i]] = 1;
        for(int j=0; j<=sum; j++){
            if(res[j] && j + arr[i] <= sum && (!res[j+arr[i]] || res[j] + 1 < res[j + arr[i]]) ) res[j + arr[i]] = res[j] + 1;
        }
    }
    if(!res[sum]) cout<<"No solution";
    //восстанавливаем ответ по нашему массиву res[]
    else{
        while(res[sum] > 1){
            for(int i=0; i<n; i++){
                if(res[sum-arr[i]] == res[sum] - 1){
                    cout<<arr[i]<<" ";
                    sum -= arr[i];
                    break;
                }
            }
        }
        cout<<sum;
    }

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Спасибо огромное за первый толковый совет. Я понял ваш метод решения. Сегодня после школы попробую реализовать!