问题描述:
假设有一堆不同面额的硬币,现在需要找零n元,问有多少种找零的方法?
解决方法:
可以使用递归来解决这个问题。我们可以将问题分解为两个子问题:
- 不使用当前面额的硬币,找零n元的方法数;
- 使用当前面额的硬币,找零(n-当前面额)元的方法数。
代码示例:
def make_change(coins, amount):
if amount == 0:
return 1
if amount < 0 or len(coins) == 0:
return 0
# 不使用当前面额的硬币找零的方法数
count1 = make_change(coins[1:], amount)
# 使用当前面额的硬币找零的方法数
count2 = make_change(coins, amount - coins[0])
return count1 + count2
coins = [1, 2, 5]
amount = 5
print(make_change(coins, amount))
运行结果为3,表示一共有3种找零的方法:[1, 1, 1, 1, 1], [1, 1, 1, 2], [2, 2, 1]。
如果需要找出所有的找零解法,可以稍作修改,将找零的路径作为参数传递,并在每次递归时记录路径。代码示例:
def make_change(coins, amount, path=[]):
if amount == 0:
return [path]
if amount < 0 or len(coins) == 0:
return []
# 不使用当前面额的硬币找零的路径
path1 = make_change(coins[1:], amount, path)
# 使用当前面额的硬币找零的路径
path2 = make_change(coins, amount - coins[0], path + [coins[0]])
return path1 + path2
coins = [1, 2, 5]
amount = 5
print(make_change(coins, amount))
运行结果为:
[[1, 1, 1, 1, 1], [1, 1, 1, 2], [2, 2, 1]]
表示一共有3种找零的方法。每个子列表表示一种找零的路径。