Отслеживание шагов динамического программирования - PullRequest
1 голос
/ 01 октября 2011

Я учу себя основам программирования и застрял в проблеме динамического программирования.Давайте возьмем печально известную проблему с рюкзаком:

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

Давайте установим предел веса на 10 и дадим два списка: weights = [2,4,7] и values ​​= [8,4,9] (Я только что сделал это).Я могу написать код, чтобы дать максимальное значение с учетом ограничения - это не проблема.Но что если я захочу узнать, какие значения я фактически использовал?Не общая стоимость - отдельные ценности.Таким образом, для этого примера максимумом будут объекты с весами 2 и 7 для общего значения 8 + 9 = 17. Хотя я не хочу, чтобы мой ответ читался как «17» - я хочу вывод спискакак: (8, 9).Это может быть легко для этой проблемы, но проблема, над которой я работаю, использует списки, которые намного больше и имеют повторяющиеся номера (например, несколько объектов имеют значение 8).

Дайте мне знать, есликаждый может думать о чем угодно.Как всегда, много любви и признательности к сообществу.

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

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

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

1 голос
/ 09 февраля 2013

Базовая реализация массива может помочь вам отслеживать, какие элементы позволили новому состоянию DP получить его значение.Например, если ваш DP-массив w[], то у вас может быть другой массив p[].Каждый раз, когда состояние генерируется для w[i], вы устанавливаете p[i] для элемента, который вы использовали для перехода к 'w [i]'.Затем, чтобы вывести список элементов, используемых для w[n], выведите p[n], а затем переходите к индексу n-weightOf(p[n]), пока не достигнете 0, чтобы вывести все элементы.

...