LeetCode322 монета номинал комбинаторные проблемы
题目描述: У вас есть монеты разных номиналов и общей сумма денег суммы . Напишите функцию для вычисления наименьшее количество монет , которые вы должны сделать до этой суммы. Если эта сумма денег не может быть выполнена по любой комбинации монет, возвращение -1
.
Этот вопрос очень классический, то есть вопросы, которые даются определенное значение и номинал монеты в монете бесконечного число обстоятельств, чтобы найти минимальное количество комбинации монет, комбинация не будет возвращать -1.
После прочтения названия, сразу подумал о решении DP.
Обычно считалось, что сумма минимального количества комбинаций = сумма каждого номинала монеты путем вычитания минимальное количество комбинаций + 1
формула рекурсии DP решить Дано:
кол [сумма] = {мин рассчитывать [сумма - монеты [I]]}, 0 <= <п;
Здесь COUNT [сумма] представляет собой сочетание минимального количества монет требуемого значения суммы, монеты является монета номиналом массива.
Согласно этой формуле, мы можем легко дать псевдо-код:
coinChange ( INT [] монеты, INT сумма): пусть рассчитывать [ 0 , 1 ... сумма + 1 ] быть в новый массив Еогеасп я: кол [I] = Max.value для г = 0 до суммы + 1 : если (я == 0 ) рассчитывать [ 0 ] = 0 еще : пусть Ь новый список для к = 0 до coins.length: если (I - монеты [к]> = 0) List.add (кол [I-монеты [K]] + 1 ); кол = getMin (л) // получить максимальное значение выше нуля в л возвращения рассчитывать [сумма] = Max.value? - 1 : рассчитывать [сумма]
Discovery Хронометраж ранг очень низким, в частности, чтобы узнать немного времени с наименьшим раствором после подачи.
Второе решение основано на жадности рекурсивного решения:
общая идея заключается в том, чтобы сначала провести номинальную стоимость монет , сортировки и использовать глобальную переменную рекордное количество комбинаций.
Начиная с самого большого номинала, максимальное количество монет в каждой комбинации вычисляется, и это, в свою очередь, сокращает количество рекурсивного вычисления, записывает количество комбинаций, меньше, чем глобальная переменная обновляется.
Код выглядит следующим образом:
частный ИНТ Рез = Integer.MAX_VALUE; общественный INT coinChange (INT [] монета, Int сумма) { Arrays.sort (монеты); coinChange (монеты, количество, coins.length-1, 0); вернуться Рез == Integer.MAX_VALUE? -1: разреш; } // частная пустота coinChange (INT [] монета, Int сумма, Int текущ, счетчик INT) { если (текущ <0) возврат; // остановка рекурсии coinChange INT I = сумма / монеты [текущ]; // Самое нет. монет [Cur] , если сумма (% монет [текущ] == 0) { Рез = Math.min (Рез, граф + I); вернуть; } Для (; г> = 0; i--) { если (количество + I + 1> = разреш) { вернуть; } CoinChange (монеты, количество монет-[текущ] * я, CUR-1, граф + I); } }