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
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Вы не правы. Двумерный массив считает, можно ли набрать вес i используя первые j предметов. А не j-ый предмет.
Далее, обычно можно сэкономить память храня и пересчитывая только одну строку этого массива, но ДП все еще остается двумерным. Также числа Фибоначчи можно считать храня лишь 2 последних числа, но на самом деле там массив на n элементов в дп.

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

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

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