518. 零钱兑换 II -- LeetCode -- 6.10

Posted 荣荣荣荣荣荣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了518. 零钱兑换 II -- LeetCode -- 6.10相关的知识,希望对你有一定的参考价值。

518. 零钱兑换 II --动态规划

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 

示例 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

0 <= amount (总金额) <= 5000

1 <= coin (硬币面额) <= 5000

硬币种类不超过 500 种

凑硬币类似与爬阶梯,(你可以从上一个阶梯,走一步上来;也可以,从上两个阶梯,走两步上来),这个题就是把能走的步数重新规定了;

用dp数组,dp [ i ] = 凑出 i 金额的方式,用 coins = [1, 2, 5] 举例,dp [ i ] = dp[i - 1] + dp[i - 2] + dp[i - 5],它可以是原来 i - 1或 i - 2 或 i - 5金额上来的;

 

int change(int amount, int* coins, int coinsSize){
    int i, j, dp[5005];
    memset(dp, 0, sizeof(dp));
    dp[0] = 1;
    for(j = 0; j < coinsSize; j++){//注意这两个循环,不可颠倒!!
        for(i = 1; i <= amount; i++){
            if(i >= coins[j]){
                dp[i] += dp[i - coins[j]];
            }
        }
    }
    return dp[amount];
}

 

以上是关于518. 零钱兑换 II -- LeetCode -- 6.10的主要内容,如果未能解决你的问题,请参考以下文章

动态规划——详解leetcode518 零钱兑换 II

Leetcode刷题Python518. 零钱兑换 II

LeetCode 518. 零钱兑换 II c++/java详细题解

LeetCode 0518. 零钱兑换 II

518. 零钱兑换 II

java刷题--518零钱兑换II