LeetCode 0518. 零钱兑换 II

【LetMeFly】518.零钱兑换 II

力扣题目链接:https://leetcode.cn/problems/coin-change-2/

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。

 

    示例 1:

    输入:amount = 5, coins = [1, 2, 5]
    输出:4
    解释:有四种方式可以凑成总金额:
    5=5
    5=2+2+1
    5=2+1+1+1
    5=1+1+1+1+1
    

    示例 2:

    输入:amount = 3, coins = [2]
    输出:0
    解释:只用面额 2 的硬币不能凑成总金额 3 。
    

    示例 3:

    输入:amount = 10, coins = [10] 
    输出:1
    

     

    提示:

    • 1 <= coins.length <= 300
    • 1 <= coins[i] <= 5000
    • coins 中的所有值 互不相同
    • 0 <= amount <= 5000

    方法一:动态规划

    d p [ i ] dp[i] dp[i]表示硬币总金额为 i i i的方案数

    初始值 d p [ 0 ] = 1 dp[0] = 1 dp[0]=1(硬币总和为0的方案只有一种:0枚硬币)

    转移方程 d p [ i ] = ∑ d p [ i − c o i n j ] dp[i] = \sum dp[i - coin_j] dp[i]=dp[icoinj]

    注意, [ 1 , 2 ] [1, 2] [1,2] [ 2 , 1 ] [2, 1] [2,1]是一种方案。因此为了避免硬币顺序不同导致方案数重复计算的情况,我们应该按照硬币顺序进行模拟。即:先全用 1 1 1元硬币,再尝试用 2 2 2元硬币替换数个 1 1 1元硬币,再考虑 3 3 3元(如果有的话)…

    • 时间复杂度 O ( l e n ( c o i n s ) × a m o u n t ) O(len(coins) \times amount) O(len(coins)×amount)
    • 空间复杂度 O ( a m o u n t ) O(amount) O(amount)

    AC代码

    C++
    class Solution {
    public:
        int change(int amount, vector<int>& coins) {
            vector<int> dp(amount + 1, 0);
            dp[0] = 1;
            for (int& t : coins) {
                for (int i = t; i <= amount; i++)
                    dp[i] += dp[i - t];
            }
            return dp.back();
        }
    };
    

    同步发文于CSDN,原创不易,转载请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/127936876

    • 2
      点赞
    • 4
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    Tisfy

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值