一、问题理解
我们需要计算用1分、5分、10分和25分硬币组成n分的所有可能方式数。这是一个典型的完全背包问题。
二、算法选择
三、关键实现细节
初始化:dp[0]=1表示0分有1种表示法
状态转移:dp[i] += dp[i-coin]
取模运算:防止整数溢出
四、代码实现
class Solution {public: int waysToChange(int n) { const int MOD = 1000000007; vector<int> dp(n + 1, 0); dp[0] = 1; // 初始化:0分有1种表示法(什么都不选) // 硬币面值按顺序处理 int coins[4] = {1, 5, 10, 25}; for (int coin : coins) { for (int i = coin; i <= n; ++i) { dp[i] = (dp[i] + dp[i - coin]) % MOD; } } return dp[n]; }};
五、优化思路
可以优化空间复杂度到O(1)
数学方法可以进一步优化
點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶(hù)
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)