# 最少硬币组合

# 1. 描述

现有2元,5元,7元的三种硬币,需要购买x 元的商品,使用最少的硬币组合付钱?

输入:2
输出:1 

# 2. 实现

(1) 递归

function coinmin(x) {
    if(x === 0) return 0
    let res = 1000
    if(x >= 2) res = Math.min(coinmin(x - 2) + 1, res)
    if(x >= 5) res = Math.min(coinmin(x - 5) + 1, res)
    if(x >= 7) res = Math.min(coinmin(x - 7) + 1, res)
    return res;
}

(2) 非递归

对于本题,这种写法可能容易理解一点。

function coinmin(x) {
    let f = [0];
    for (let i = 1; i < x + 1; i++) {
        f[i] = 10000
        if (f[i - 2] != null) f[i] = Math.min(f[i - 2] + 1, f[i])
        if (f[i - 5] != null) f[i] = Math.min(f[i - 5] + 1, f[i])
        if (f[i - 7] != null) f[i] = Math.min(f[i - 7] + 1, f[i])
    }
    let res = f.pop()
    return res === 10000 ? -1 : res
}

这是一个通用的解法,理解起来可能会难一点。

function coinChange(x, coins) {
    let f = [0];
    for (let i = 1; i < x + 1; i++) {
        f[i] = 10000
        for (let j = 0; j < coins.length; j++) {
            if (f[i - coins[j]] != null) {
                f[i] = Math.min(f[i - coins[j]] + 1, f[i])
            }
        }
    }
    let res = f.pop()
    return res === 10000 ? -1 : res
}
更新时间: 12/30/2021, 9:57:33 AM