刷題-力扣-面試題 08.11. 硬幣
阿新 • • 發佈:2022-03-04
題目連結
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/coin-lcci
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題目描述
硬幣。給定數量不限的硬幣,幣值為25分、10分、5分和1分,編寫程式碼計算n分有幾種表示法。(結果可能會很大,你需要將結果模上1000000007)
示例1:
輸入: n = 5
輸出:2
解釋: 有兩種方式可以湊成總金額:
5=5
5=1+1+1+1+1
示例2:
輸入: n = 10 輸出:4 解釋: 有四種方式可以湊成總金額: 10=10 10=5+5 10=5+1+1+1+1+1 10=1+1+1+1+1+1+1+1+1+1
說明:
注意:
你可以假設:
- 0 <= n (總金額) <= 1000000
題目分析
- 根據題目描述,判斷使用4種面額的金幣有多少種組成n的方式
- 對於面值為coin的硬幣,當存在coin<i<n時,如果存在一種組合等於i-coin,則在該硬幣組合中加如一個coin的硬幣,就可以得到一種組合等於i的硬幣組合。
- 動態規劃,dp[x]表示金額x的組合數。遍歷4中金幣,對於每種金幣coin進行如下操作,遍歷i從coin到n,將dp[i-coin]加到ap[i]上。
- 邊界條件dp[0]=1
程式碼
class Solution { private: constexpr static int mod = 1000000007; std::vector<int> coins = {25, 10, 5, 1}; public: int waysToChange(int n) { std::vector<int> dp(n + 1, 0); dp[0] = 1; for (auto coin : this->coins) { for (int i = coin; i <= n; ++i) { dp[i] = (dp[i] + dp[i - coin]) % this->mod; } } return dp[n]; } };