题目要求
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.
Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)
Example 2:
coins = [2], amount = 3
return -1.
Note:
You may assume that you have an infinite number of each kind of coin.
解题思路
使用一个一维数组来解决这个问题,数组cnt[i]表示组成i元最少要使用多少枚硬币。如果cnt[i]的值是65535的话,说明所给的硬币不能组成元。于是我们可以得到状态转移方程:
cnt[i] = min(cnt[i],cnt[i-coins[0]]+1,cnt[i-coins[1]]+1,...,cnt[i-coins[n]]+1)
代码实现如下:
代码实现
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if(amount < 0) return -1;
int cnt[10000];
for(int i = 0;i<10000;i++) cnt[i] = 65535;
cnt[0] = 0;
for(int i=1; i<=amount; ++i) {
for(int j=0; j<coins.size(); ++j) {
if(i>=coins[j]) {
cnt[i] = min(cnt[i], cnt[i-coins[j]] + 1);
}
}
}
if(cnt[amount]!=65535) return cnt[amount];
else return -1;
}
};
复杂度分析
该算法的复杂度应该是O(n^2)的。
本文介绍了一种解决硬币找零问题的方法,通过动态规划算法找出组成特定金额所需的最少硬币数量,并给出了C++代码实现。
727

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



