У меня возникают проблемы с пониманием динамического программирования решения различных проблем, в частности проблемы изменения монеты:Динамическое программирование монет Изменить Проблемы
«Учитывая значение N, если мы хотим внести изменения в N центов, и мы имеем бесконечная подача каждой из S = {S1, S2, .., Sm} ценных монет, сколько способов сделать это изменение? Порядок монет не имеет значения.
Например, для N = 4 и S = {1,2,3}, существует четыре решения: {1,1,1,1}, {1,1,2}, {2,2}, {1,3}, поэтому выход должен быть равен 4 Для N = 10 и S = {2, 5, 3, 6} существует пять решений: {2,2,2,2,2}, {2,2,3,3}, {2,2, 6}, {2,3,5} и {5,5}, поэтому выход должен быть 5. "
Существует еще одна вариация этой проблемы, когда решение представляет собой минимальное количество монет для удовлетворения суммы.
Эти проблемы выглядят очень похожими, но решения очень разные.
Количество возможных способов внесения изменений: оптимальная субструктура для этого: DP (m, n) = DP (m-1, n) + DP (m, n-Sm) где DP - это число решения для всех монет до m-й монеты и суммы = n.
Минимальное количество монет: оптимальная подструктура для этого является DP [I] = {Мин DP [я-d1], DP [я-d2], ... DP [я-дп]} + 1 где i - общая сумма, а d1..dn - номинал каждой монеты.
Почему первый требует 2-мерного массива, а второй - 1-мерного массива? Почему оптимальная субструктура для количества способов внесения изменений не "DP [i] = DP [i-d1] + DP [i-d2] + ... DP [i-dn]", где DP [i ] - количество способов, которыми я могу получить монеты. Это звучит логично для меня, но вызывает неправильный ответ. Почему это второе измерение для монет, необходимых в этой проблеме, но не необходимое в проблеме минимального количества?
ССЫЛКИ НА ПРОБЛЕМЫ:
http://comproguide.blogspot.com/2013/12/minimum-coin-change-problem.html http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/
Спасибо заранее. На каждом веб-сайте я расскажу только, как работает решение, а не почему другие решения не работают.