322. 零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
【LeetCode - 322. 零钱兑换】
文章图片
解题思路: 此题有两种解法可解,一种是BFS,求层数,另一种是DP,DP解起来最方便,dp[i]表示凑齐总金额为i有多少种办法,状态转移方程,dp[i]=min(dp[i],dp[i-coin]+1).
// DP,Time:O(n), Space:O(n)
class Solution {
public:
int coinChange(vector& coins, int amount) {
vector dp(amount + 1, 999);
dp[0] = 0;
for (int i = 0;
i < coins.size();
++i) {
if (amount >= coins[i]) dp[coins[i]] = 1;
}
for (int i = 1;
i <= amount;
++i) {
for (auto coin : coins) {
if (coin <= i) {
dp[i] = min(dp[i], dp[i - coin] + 1);
}
}
}
return dp[amount] == 999 ? -1 : dp[amount];
}
};
推荐阅读
- 数据结构与算法|【算法】力扣第 266场周赛
- leetcode|今天开始记录自己的力扣之路
- Python|Python 每日一练 二分查找 搜索旋转排序数组 详解
- 【LeetCode】28.实现strstr() (KMP超详细讲解,sunday解法等五种方法,java实现)
- LeetCode-35-搜索插入位置-C语言
- leetcode python28.实现strStr()35. 搜索插入位置
- Leetcode Permutation I & II
- python|leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法
- LeetCode 28 Implement strStr() (C,C++,Java,Python)
- Python|Python Leetcode(665.非递减数列)