最小硬币找零问题 - 回溯

Posted

技术标签:

【中文标题】最小硬币找零问题 - 回溯【英文标题】:Minimum Coin change problem - Backtracking 【发布时间】:2020-10-18 03:35:58 【问题描述】:

我正在尝试用最少数量的硬币解决硬币更换问题 使用回溯法。

我实际上已经完成了它,但我想添加一些选项,以按其单位打印硬币数量,而不仅仅是总金额。

这是我下面的python代码。

def minimum_coins(coin_list, change):
min_coins = change 
if change in coin_list: 
    return 1
else:
    for coin in coin_list:
        if coin < change: 
            num_coins = 1 + minimum_coins(coin_list, change - coin)
            if num_coins < min_coins:
                min_coins = num_coins
return min_coins

coin_list = []
unit = input("Enter the Coin Unit\n")
#1 10 15 20
change = int(input("Enter the Total Change\n"))
#73
unit = unit.split()

for i in unit:
    coin_list.append(int(i))

min = minimum_coins(coin_list, change)
#print("You need 3 1's, 1 10's, 0 15's, 3 20's") <- I want to implement this option.
print("Total number of coins required is %s." % min) #7

我正在努力在我的代码中实现这一点。

因为回溯很复杂,我不知道如何按单位检查硬币的数量。

【问题讨论】:

【参考方案1】:

可能的方式:

def minimum_coins(coin_list, change):
    min_coins = change
    if change in coin_list:
        return 1, [change]
    else:
        cl = []
        for coin in coin_list:
            if coin < change:
                mt, t = minimum_coins(coin_list, change - coin)
                num_coins = 1 + mt
                if num_coins < min_coins:
                    min_coins = num_coins
                    cl = t + [coin]
    return min_coins, cl

change = 73
coin_list = [1, 10, 15, 20]
min, c = minimum_coins(coin_list, change)
#print("You need 3 1's, 1 10's, 0 15's, 3 20's") <- I want to implement this option.
print("Total number of coins required is %s." % min, c) #7

>>>Total number of coins required is 7. [20, 20, 20, 10, 1, 1, 1]

【讨论】:

非常感谢。我以 99% 的方式尝试了你的方法,但我将它作为全局变量来处理。 (cl[]) 在回溯中更改校验值太复杂了 是的,可以将数据保存在全局列表中,但通常在这种情况下需要添加一个函数参数 - 中间硬币变化列表。

以上是关于最小硬币找零问题 - 回溯的主要内容,如果未能解决你的问题,请参考以下文章

python基础----找零问题

贪心算法之硬币找零

硬币找零(动态编程)

硬币找零问题的动态规划实现

找到产生给定值的最小硬币集

硬币找零问题