为了账号安全,请及时绑定邮箱和手机立即绑定

力扣面试题08.11:如何计算硬币组合数

标签:
C++

https://img1.sycdn.imooc.com/66812268085f82ed09340698.jpg

一、问题理解

我们需要计算用1分、5分、10分和25分硬币组成n分的所有可能方式数。这是一个典型的完全背包问题

二、算法选择

  1. 动态规划‌:适合解决这种组合计数问题

  2. 完全背包‌:每种硬币可以使用无限次

  3. 有序处理‌:按硬币面值从小到大处理避免重复计数

三、关键实现细节

  1. 初始化‌:dp[0]=1表示0分有1种表示法

  2. 状态转移‌:dp[i] += dp[i-coin]

  3. 取模运算‌:防止整数溢出

四、代码实现

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];
    }};

五、优化思路

  1. 可以优化空间复杂度到O(1)

  2. 数学方法可以进一步优化

来源:力扣面试题08.11:如何计算硬币组合数

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消