1. 程式人生 > 其它 >刷題-力扣-面試題 08.11. 硬幣

刷題-力扣-面試題 08.11. 硬幣

題目連結

來源:力扣(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

題目分析

  1. 根據題目描述,判斷使用4種面額的金幣有多少種組成n的方式
  2. 對於面值為coin的硬幣,當存在coin<i<n時,如果存在一種組合等於i-coin,則在該硬幣組合中加如一個coin的硬幣,就可以得到一種組合等於i的硬幣組合。
  3. 動態規劃,dp[x]表示金額x的組合數。遍歷4中金幣,對於每種金幣coin進行如下操作,遍歷i從coin到n,將dp[i-coin]加到ap[i]上。
  4. 邊界條件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];
    }
};