在恒定时间内换硬币的方法有多少?
假设我有三种类型的硬币——一分钱 (0.01)、一分钱 (0.05) 和一角钱 (0.10),我想找到兑换一定金额的方法的数量。例如更改 27 美分:
change(amount=27, coins=[1,5,10])
解决此问题的一种更常见的方法是递归/动态地:找到在没有特定硬币的情况下进行更改的方法数量,然后减去该硬币数量并找到使用该硬币进行更改的方法。
但是,我想知道是否有办法使用缓存值和 mod 运算符来做到这一点。例如:
-
10 美分可以通过 4 种方式更改:
- 10 便士
- 1 角钱
- 2 镍
- 1 镍,5 便士
-
5 美分可以通过两种方式更改:
- 1 镍
- 5 便士
-
1-4 美分可以通过 1 种方式改变:
- 1-4 便士
例如,这是错误的,但我的想法是:
def change(amount, coins=[1,5,10]):
cache = {10: 4, 5: 2, 1: 1}
for coin in sorted(coins, reverse=True):
# yes this will give zerodivision
# and a penny shouldn't be multiplied
# but this is just to demonstrate the basic idea
ways = (amount % coin) * cache[coin]
amount = amount % ways
return ways
如果是这样,该算法将如何工作?任何语言(或伪语言)都可以。