Дело в том, что этот метод, который я здесь описал - это что-то вроде хрестоматийного примера по ДП
Главный принцип ДП заключается в том, что если задачу можно разбить на независимые подзадачи, то из оптимальности решения всей задачи обязана следовать оптимальность решения каждой из подзадач. Это может иметь некоторое отношение к перебору, а может и не иметь. Вопрос только в способе разбиения на подзадачи.
В данном случае f(m, w) описывает пространство подзадач: чтобы узнать, как оптимально заполнить вес w с помощью m предметов, мы должны либо взять m-ый, либо не взять, и в любом случае остальные предметы выбрать оптимально. Таким образом, подзадачей является решение данной задачи, с использованием *упорядоченной части* предметов и части предоставляемого веса.
Цитата(lapp @ 14.11.2006 11:37)
Это ты сам придумал или взял где-то?
Именно это - может и сам, хотя я уже и не вспомню; мое первое знакомство с ДП состоялось на задаче про банкиров. У нас есть m денег, и n банкиров. Дана таблица A[i,j] - сколько заплатит банкир i, получив j денег. Надо распределить деньги между банкирами. Решается аналогично: f(x, y) - максимальная прибыль, которую можно получить, распределяя x денег между первыми y банкирами.
Насколько я помню, это было в 9м классе, т.е. 8 лет назад, и мне тогда довольно непросто было "въехать в тему" Беллмана, не то что самому ее придумать. С опытом, конечно, лучше стало
- и с ДП, и с придумываением (вместо въезжания) всякого разного.
Вообще на динамику очень много бывает красивых и сложных задач.
Цитата
И еще: что ты думаешь о рекурсии? насколько она экономит вычисления? и экономит ли вообще?
Рекурсия чаще всего работает медленнее, чем тот же алгоритм, переписанный итеративно. Куча времени уходит на вызовы, а не на вычисления. А вычисления экономит не рекурсия, а тот самый подход, о котором Вы говорите - сохранять все полученные когда-либо результаты.
Например, для рюкзака можно написать такую рекурсию:
Код
function f(m, w)
если f еще не была посчитана
считаем и запоминаем
возвращаем
А можно просто выбрать такой порядок обхода, чтобы мы всегда обращались к уже посчитанным значениям. В нашем случае это будет обход слева-направо, сверху вниз:
Код
for m
for w
f:=...
С другой стороны, DFS писать без рекурсии - мазохизм какой-то. Обычно по ограничениям задачи понятно, пройдет ли по времени рекурсия.
Если же говорить не об олимпиадных задачах, а о сложных проектах, то там, при необходимости, рекурсией грех пренебрегать, когда внутри рекурсивной процедуры выполяются достаточно трудоемкие операции - выигрыш в производительности при переходе к итеративному алгоритму будет несущественным, а readability и maintainability упадет dramatically.
Цитата
А может, именно это имел в виду автор темы, упоминая некие "таблицы"?
Сдается мне, ОП как раз проходит основы ДП