一看就是用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]; } };
原文地址:https://www.cnblogs.com/hankunyan/p/9937405.html
时间: 2024-10-15 08:11:28