当前位置:首页 > 力扣 > 力扣面试08.11题解析:动态规划解决零钱兑换问题(附完整代码与优化思路)

力扣面试08.11题解析:动态规划解决零钱兑换问题(附完整代码与优化思路)

2个月前 (08-28)

力扣面试08.11题解析:动态规划解决零钱兑换问题(附完整代码与优化思路) 动态规划 力扣面试题 C++ 力扣 第1张

一、题目解读

力扣面试08.11题要求计算给定金额n的零钱兑换方案总数,可使用指定面额的硬币(如1、5、10、25),每种硬币无数量限制。需输出总方案数对10^9+7取模的结果。题目核心在于组合计数,需高效处理重复子问题,避免指数级时间复杂度。

二、解题思路

采用动态规划(Dynamic Programming)策略,将问题拆解为子问题组合。定义状态:dp[i]表示金额i的兑换方案总数。核心转移方程基于“最后一步使用的硬币面值”分类,即dp[i] = sum(dp[i-coin])(coin为可用硬币)。通过按面值顺序遍历,确保每个子问题仅被计算一次,避免重复。

三、解题步骤

1. 初始化:设置dp[0]=1(0元无需兑换,方案数为1)。

2. 硬币顺序处理:按固定面值数组[1,5,10,25]顺序遍历,避免组合重复。

3. 动态更新:对每个金额i,遍历硬币coin,若i≥coin则累加dp[i] += dp[i-coin],并取模防溢出。

4. 结果返回:最终dp[n]即为目标方案数。

四、代码与注释

class Solution {
public:
    int waysToChange(int n) {
        const int MOD = 1000000007; // 定义取模常数防溢出
        vector<int> dp(n + 1, 0); // 初始化dp数组,金额0~n的方案数
        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; // 转移方程:当前方案 = 原方案 + 减去coin后的方案
            }
        }

        return dp[n];
    }
};

注释解析:

● MOD常量:大数取模避免整数溢出。

● dp初始化:强制金额0的方案数为1,作为递归基。

● 双层循环逻辑:外层按面值顺序避免重复组合,内层通过i-coin回溯子问题。

取模运算:确保每次累加结果合法。

五、总结

本解法通过动态规划将复杂组合问题转化为线性递推,时间复杂度O(n×硬币数),空间O(n)。关键在于按面值顺序遍历,保证子问题独立性。代码简洁且优化了溢出风险,适用于面试场景。进一步优化方向可探索空间压缩(如滚动数组)或数学组合公式推导。掌握此类动态规划模板对算法面试中「计数类DP」问题具有通用借鉴价值。

参考:力扣面试题08.11题解

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

力扣94:递归之美 轻松掌握二叉树中序遍历

力扣94:递归之美 轻松掌握二叉树中序遍历

题目解读二叉树的中序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。对于二叉搜索树,中序遍历的结果恰好是节点值的升序排列。给定一个二叉...

NOIP 2008火柴棒等式题解(C++代码实现)  动态规划与枚举算法详解

NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

一、题目解读火柴棒等式问题(NOIP 2008,洛谷P1149)要求使用给定数量的火柴棒,构造形如 A + B = C 的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

洛谷2789题解:直线交点数的递归求解与优化(附代码详解)

洛谷2789题解:直线交点数的递归求解与优化(附代码详解)

一、题目解读洛谷2789题要求计算n条直线在平面上两两相交时产生的不同交点数量。题目强调“不同”交点,需排除重复情况。解题关键在于如何高效枚举所有可能的交点组合,并避免重复计数。二、解题思路参考代码采...

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

一、题目解读洛谷P4999题要求处理给定区间 [L, R] 内数字的拆分与求和问题。每个数字需拆分为其各位数字之和,并计算区间内所有数字之和的累加结果。题目需考虑大数情况,并采用取模运算(MOD=1e...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。