📜  购买最少的物品而无需找零并提供硬币(1)

📅  最后修改于: 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,此时使用的硬币就是最少的。但是该方法并不一定总是正确的,因为某些情况下贪心策略可能并不是最优解。