本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。
为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。
由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。
示例 1:
输入:coins = `[1, 2, 5]`, amount = `11`
输出:`3`
解释:11 = 5 + 5 + 1
示例 2:
输入:coins = `[2]`, amount = `3`
输出:-1
示例 3:
输入:coins = [1], amount = 0
输出:0
示例 4:
输入:coins = [1], amount = 1
输出:1
示例 5:
输入:coins = [1], amount = 2
输出:2
提示:
1 <= coins.length <= 121 <= coins[i] <= 2^31 - 10 <= amount <= 10^4注意:本题与主站 322 题相同: https://leetcode-cn.com/problems/coin-change/
拿到动态规划问题后,做以下几个步骤:
粗略一看,本题是求装满背包的最小问题+完全背包。套用模板:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, amount + 1);
for (int i = 0; i < coins.size(); ++i)
for (int j = coins[i]; j <= amount; ++j)
dp[j] = min(dp[j], dp[j - coins[i]] + 1);
return dp[amount] <= amount ? dp[amount] : -1;
}
};