Every day a Leetcode
题目来源:518. 零钱兑换 II
解法1:动态规划
dp[i]: 总金额为 i 的硬币组合数。
初始化: dp[0] = 1。
边界:dp[0]=1。只有当不选取任何硬币时,金额之和才为 0,因此只有 1 种硬币组合。
状态转移:
遍历 coins,对于其中的每个元素 coin,进行如下操作:遍历 i 从 coin 到 amount,将 dp[i−coin] 的值加到 dp[i]。
答案:dp[amount]。
代码:
/*
* @lc app=leetcode.cn id=518 lang=cpp
*
* [518] 零钱兑换 II
*/
// @lc code=start
class Solution
{
public:
int change(int amount, vector<int> &coins)
{
// 特判
if (amount < 0 || coins.empty())
return 0;
// dp[i]: 总金额为 i 的硬币组合数
vector<int> dp(amount + 1, 0);
// 初始化
dp[0] = 1;
// 状态转移
for (int &coin : coins)
for (int i = coin; i <= amount; i++)
dp[i] += dp[i - coin];
return dp[amount];
}
};
// @lc code=end
结果:

复杂度分析:
时间复杂度:O(amount×n),其中 amount 是总金额,n 是数组 coins 的长度。
空间复杂度:O(amount)。
本文介绍了如何使用动态规划解决LeetCode题目518-零钱兑换II问题,通过计算总金额为i的硬币组合数来实现,时间复杂度为O(amount×n),空间复杂度为O(amount)。
527

被折叠的 条评论
为什么被折叠?



