0Pricing
Competitive Programming Academy · Урок

Рюкзак с оптимизацией памяти

Сведите двумерную таблицу к одной строке

«Рюкзак с оптимизацией памяти» — бесплатный урок Competitive Programming Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Competitive Programming Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Competitive Programming Academy содержит 4 уроков всего.

Зачем оптимизировать память

Полная таблица требует n умножить на cap ячеек памяти, что может стать проблемой на больших входных данных. Оптимизация памяти сводит её к одной повторно используемой строке.

Важна только последняя строка

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

Сведите таблицу к одному массиву

Храните один массив dp длины cap+1. При обработке каждого предмета изменяйте его на месте, чтобы он представлял новую строку.

dp = [0] * (cap + 1)

Ловушка повторного использования

Если перебирать вместимость слева направо, dp[w - wt[i]] может быть уже обновлено для этого же предмета. Тогда Вы сможете взять предмет i дважды.

Перебирайте вместимость в обратном порядке

Решение — перебирать вместимость от большего значения к меньшему. Движение назад гарантирует, что dp[w - wt[i]] всё ещё хранит значение из предыдущей строки.

for w in range(cap, wt[i] - 1, -1):
    dp[w] = max(dp[w], val[i] + dp[w - wt[i]])

Почему обратный порядок работает

При вычислении dp[w] меньший индекс w - wt[i] в этом проходе ещё не был изменён, поэтому он содержит значение из предыдущей строки, как и требуется.

Остановитесь на wt[i]

Вместимость меньше wt[i] не позволяет поместить предмет, поэтому цикл останавливается на wt[i]. Пропуск этих значений экономит несколько лишних итераций.

Полный цикл

Всё решение состоит из двух вложенных циклов по одному массиву. Снаружи перебираются предметы, внутри вместимость — в обратном порядке, и ответ получается автоматически.

for i in range(n):
    for w in range(cap, wt[i] - 1, -1):
        dp[w] = max(dp[w], val[i] + dp[w - wt[i]])

Прочитайте последнюю ячейку

После обработки всех предметов dp[cap] хранит максимальную ценность. Это то же число, которое дала бы двумерная таблица, но памяти требуется значительно меньше.

То же время, меньше памяти

Вы не ускорили алгоритм: он по-прежнему выполняет работу порядка n умножить на cap. Вы лишь сократили объём памяти с квадратичного до линейного.

Когда это особенно полезно

Этот приём выручает, когда cap велико и двумерная таблица превысила бы лимит памяти. Это стандартный приём на соревнованиях, который стоит запомнить.

Быстрая проверка

Проверьте главное правило для одномерного рюкзака.

Итоги

Вы свели двумерную таблицу к одному массиву и перебирали вместимость в обратном порядке, сохранив корректность и заменив квадратичное потребление памяти линейным. 🚀

Часто задаваемые вопросы

Урок «Рюкзак с оптимизацией памяти» бесплатный?

Да — полный текст урока «Рюкзак с оптимизацией памяти» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Competitive Programming Academy, подпишись на CoddyKit PRO. Курс Competitive Programming Academy содержит 4 уроков всего.

Чему я научусь в уроке «Рюкзак с оптимизацией памяти»?

Сведите двумерную таблицу к одной строке Ты практикуешь Competitive Programming Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Competitive Programming Academy?

Предыдущий опыт не требуется. Competitive Programming Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Рюкзак с оптимизацией памяти»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Competitive Programming Academy?

Да. Каждый урок Competitive Programming Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Рюкзак 0/1: взять или оставить
  2. Рюкзак с оптимизацией памяти
  3. Неограниченный рюкзак и DP для размена монет
  4. Сумма подмножества и разбиение
← Назад к Competitive Programming Academy