📅  最后修改于: 2023-12-03 14:57:46.986000             🧑  作者: Mango
在计算机科学中,我们常常需要处理货币的问题。其中一个经典的问题是如何在不需要找零的情况下,用最少的硬币来购买物品。
假设我们有一个货币系统,其中有若干种硬币,它们的面值分别为 c1
, c2
, ..., ck
,其中 c1
< c2
< ... < ck
。现在我们需要购买一个价值为 n
的物品,而无需找零。问最少需要用多少个硬币来实现这个目标。
这个问题可以使用动态规划来解决。我们可以定义一个数组 dp
,其中 dp[i]
表示要达到价值为 i
的物品所需的最少硬币数量。
对于任意的 i
,我们可以遍历所有的硬币面值 cj
,将硬币 cj
放入购物车中,只需考虑达到价值为 i-cj
的物品所需的最少硬币数量,加上一个额外的硬币即可得到达到价值为 i
的物品所需的最少硬币数量。即:
dp[i] = min(dp[i], dp[i-cj]+1)
代码段如下:
def coins(n, coins_lst):
dp = [float("inf")] * (n + 1)
dp[0] = 0
for i in range(1, n+1):
for j in range(len(coins_lst)):
if coins_lst[j] <= i:
dp[i] = min(dp[i], dp[i-coins_lst[j]]+1)
return dp[n]
假设硬币面值列表为 [1, 2, 5]
,需要购买价值为 11
的物品。则最少需要用 3
个硬币,分别为 5 + 5 + 1
。
>>> coins(11, [1, 2, 5])
3
该问题还可以扩展为需要找零的情况,此时可以使用贪心算法来解决。对于任意的 i
,我们可以使用面值最大的硬币 cj
直接减去,直到达到价值为 0
,此时使用的硬币就是最少的。但是该方法并不一定总是正确的,因为某些情况下贪心策略可能并不是最优解。