LeetCode322 монет Change -------- обычное решение DP с эффективным решением жадным

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); 
        } 
    }

  

 

рекомендация

отwww.cnblogs.com/siren27/p/11300472.html