LeetCode 518. Coin Change 2

Posted 約束の空

tags:

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

一看就是用dp来做,但是这道题还是有点意思的。

dp[i] = sum_{coin} dp[i-coin]

上述的递推公式看似很对,但是会把重复的情况都考虑进去。举个例子,算dp[5]的时候,dp[5]=dp[0]+dp[4]+dp[3],但是之前算的dp[4]就是从dp[3]计算得到的。

解决办法是,一个一个硬币更新dp,即 dp[i] += dp[i-coin] for each coin。这样,对于当前的coin,dp[i-coin] 一定是不会包含当前coin的。

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

 

以上是关于LeetCode 518. Coin Change 2的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 518. Coin Change 2

518. Coin Change 2

518. Coin Change 2

算法: 零钱兑换的方法数518. Coin Change 2

动态规划-零钱兑换-leetcode518

leetcode经典动态规划题目:518零钱兑换