Задать вопрос
Lite_stream
@Lite_stream

Задача о рюкзаке, используя 1-D массив?

Почему, когда традиционно рассказывают про рюкзак (однопараметровый, где у предметов есть только вес: N предметов с весами wi и max размер рюкзака S), то используют двумерный массив состояний, где dp[i][j] = bool, который означает, можно ли набрать вес j используя или не используя i-й предмет. Но ведь это решение тратит N * S памяти, можно же сделать то же самое с одномерным массивом dp[i] = true, проходя по всем true и дорисовывая ребра из i-го веса (если там true) в dp[i + wj] = true. По времени тоже N * S, но по памяти просто S
  • Вопрос задан
  • 193 просмотра
Подписаться 2 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Архитектор ПО
    4 месяца
    Далее
  • Stepik
    Алгоритмы: теория и практика. Структуры данных
    1 неделя
    Далее
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Вы не правы. Двумерный массив считает, можно ли набрать вес i используя первые j предметов. А не j-ый предмет.
Далее, обычно можно сэкономить память храня и пересчитывая только одну строку этого массива, но ДП все еще остается двумерным. Также числа Фибоначчи можно считать храня лишь 2 последних числа, но на самом деле там массив на n элементов в дп.

Этот трюк не всегда возможен. Например, если вам надо не только максимальный вес/цену найти, а еще и набор предметов. Восстановление ответа не всегда можно сделать лишь по последней строке.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы