希望你能懂的动态规划算法-----硬币问题

本文探讨了硬币找零问题的动态规划解决方案,通过逐步分析和计算,展示了如何利用最少数量的硬币组合来达到指定金额。文章详细解释了动态规划的基本思路,包括初始化状态、状态转移方程及最终结果的获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目如下

在这里插入图片描述

2. 动态规划思路

动态规划的具体思路:

在这里插入图片描述

如上图 :
1. 第一层的dp(11)表示没有硬币加入
2. 第二层的1+dp(11-1)表示硬币1加入 (+1表示有一个硬币加入)
3. 第三层 得到dp(0)

实现上述方法, 我们要求出dp(1) dp(2) dp(3)…都等于多少就可以得到dp(11)的值

在这里插入图片描述

表格1:我们求出当只有硬币1 的时候dp(0)到dp(11)的所需的硬币个数

分别为
dp(1) 1个
dp(2) 2个



dp(11) 11个
详细计算看 表格2

01234567891011
00InfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinity
101234567891011
20
50

表格2: 这时我们有硬币1到各个dp(n)的所需硬币个数,此时算硬币2。

dp(1) 1 - 2 == -1 无法达到 得Infinity。 而硬币1到达dp(1)所需的硬币个数为1<Infinity,故可以延用dp(1)==1
dp(2) 2 - 2 ==0 可以达到,需要硬币的个数为dp(0)+1(+1表示,多了个硬币2),此时到达dp(2)的硬币数比原先小,则覆盖原先的值。
dp(3) 3 - 2 ==1 表示还需1元达到三元,而1元我们求出需要一个硬币,需要硬币的个数为dp(1)+1 ==2,比原来小覆盖。


以此类推得到 表格2 3

表格2
01234567891011
00InfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinity
101234567891011
2011223344556
50
表格3
01234567891011
00InfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinityInfinity
101234567891011
2011223344556
5011221223323

3. javascript算法

function coinChange(coins: number[], amount: number): number {
    const dp: number[] = new Array(amount + 1).fill(Infinity);
    dp[0] = 0;
    for (let i = 1; i <= amount; i++) {
        for (let j = 0; j < coins.length; j++) {
            if (coins[j] > i) continue;
            const a = dp[i - coins[j]] + 1;
            dp[i] = Math.min(dp[i], a);
        }
    }

    return dp[amount] === Infinity ? -1 : dp[amount];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值