Representing a Sum with Unlimited Amount of Coins
Може ли малко помощ на 4 задача от домашното за DP? Как трябва да стане дали пак във матрица да пазим сумите или е е излишно?
Благодаря.
Може ли малко помощ на 4 задача от домашното за DP? Как трябва да стане дали пак във матрица да пазим сумите или е е излишно?
Благодаря.
Наблюдението е следното:
Имаме монетите { 1, 2, 3 } и трябва да намерим всички начини (комбинации) да получим сумата S = 4. Ако махнем монетата 3, проблемът остава същият - с по-малък брой монети. Да примем, че знаем решението с монетите { 1, 2 } - 3 начина. Как това ни помага, когато добавим 3 към възможните монети?
При всяко положение намерените начини поне ще се запазят. Добавяйки монети, решението може само да се разшири. Кога се разширява? В два случая:
И тука вече можем да си изведем следната рекурентна зависимост:
начините да получим 4 с { 1, 2, 3 } = начините да получим 4 с { 1, 2 } + начините да получим (4 - 3) с { 1, 2, 3 }
По-точно: Combinations(c, S) = Combinations(c - 1, S) + Combinations(c, S - coins[c]), където c е индексът на текущата монета, а S - търсената сума.
С bottom-up подход, много лесно може да си го изведем в таблица (редовете са монетите, колоните са сумите):
0 1 2 3 4
1 0 1 1 1 1
2 0 1 2 2 3
3 0 1 2 3 4
Стойностите в клетките отговарят на начините, по които можем да образуваме текущата сума, ползвайки всички монети до момента.
Помислете дали цялата таблица ни е необходима - можем ли да спестим памет? :)
Здравей Наско,
И аз реших задачата по подобен начин с малка разлика, че когато търсената сума е 0, в таблицата попълвам 1(Броят начини да получиш сума равна на 0 е един, когато не използваш нито една монета). Така не се налага допълнително да се проверява дали сумата е равна на монетата, защото ако е така, то Combinations(c, S - coins[c]) става Combinations(c, 0), което е 1.
А относно пестенето на памет, от рекурентната зависимост се вижда, че се обръщаме към предходния ред, така че може вместо цяла таблица да пазим само един ред от нея. Аз съм ползвал едномерен масив.
Ето го моето решение: http://pastebin.com/i70hRmYB
Браво, не се бях усетил за нулата. :)