【LeetCode-动态规划】零钱兑换
题目描述
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
注意:
给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
示例:
输入: [1,2,3]
输出: 6
输入: [1,2,3,4]
输出: 24
题目链接: https://leetcode-cn.com/problems/coin-change/
思路
用动态规划来做。令dp[i]表示凑成金额i所需要的最少的硬币个数,假设有两种面值不同的金币c1, c2,则有dp[i] = min(dp[i-cj])+1,j=1或者2,i>=cj。代码如下:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int MAX = amount+1;
vector<int> dp(amount+1, MAX);
dp[0] = 0;
for(int i=1; i<=amount; i++){
for(int j=0; j<coins.size(); j++){
if(i>=coins[j]){
dp[i] = min(dp[i], dp[i-coins[j]]+1);
}
}
}
return dp[amount]==MAX? -1:dp[amount];
}
};
- 时间复杂度:O(sn)
其中,s为金额,n为面额数。 - 空间复杂度:O(s)
s为金额。