Исследование методов решения задачи минимального сдачи монет: динамическое программирование, жадный алгоритм, рекурсивный подход

Метод 1: динамическое программирование
Динамическое программирование — это эффективный подход к решению проблемы минимального сдачи монеты. Он разбивает проблему на более мелкие подзадачи и сохраняет оптимальные решения в таблице.

def min_coin_change(coins, amount):
    dp = [float('inf')] * (amount + 1)
    dp[0] = 0
    for coin in coins:
        for i in range(coin, amount + 1):
            dp[i] = min(dp[i], dp[i - coin] + 1)
    return dp[amount] if dp[amount] != float('inf') else -1

Метод 2: Жадный алгоритм
Жадный алгоритм — это еще один подход, но он не всегда дает оптимальное решение. Он выбирает монету наибольшего номинала, соответствующую оставшейся сумме.

def min_coin_change_greedy(coins, amount):
    coins.sort(reverse=True)
    num_coins = 0
    for coin in coins:
        if coin <= amount:
            num_coins += amount // coin
            amount %= coin
    return num_coins if amount == 0 else -1

Метод 3: рекурсивный подход
Рекурсивный подход можно использовать для решения проблемы минимального сдачи монеты, но он может быть менее эффективным, чем динамическое программирование для больших входных данных.

def min_coin_change_recursive(coins, amount):
    if amount == 0:
        return 0
    min_coins = float('inf')
    for coin in coins:
        if coin <= amount:
            num_coins = min_coin_change_recursive(coins, amount - coin)
            if num_coins != -1:
                min_coins = min(min_coins, num_coins + 1)
    return min_coins if min_coins != float('inf') else -1