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)。