Рюкзак с оптимизацией памяти
Сведите двумерную таблицу к одной строке
«Рюкзак с оптимизацией памяти» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 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) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Рюкзак с оптимизацией памяти»?
Сведите двумерную таблицу к одной строке Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Рюкзак с оптимизацией памяти»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Рюкзак 0/1: взять или оставить
- Рюкзак с оптимизацией памяти
- Неограниченный рюкзак и DP для размена монет
- Сумма подмножества и разбиение