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的主要内容,如果未能解决你的问题,请参考以下文章