给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
class Solution {
public:
vector<int> count; //记录各个金额所需耗费的最少硬币个数
int coinChange(vector<int>& coins, int amount) {
count.resize(amount + 1); //[0, amount - 1]转变为 [1, amount]
if(amount < 1)
return 0;
return dp(coins, amount);
}
int dp(vector<int> & coins, int amount) {
//硬币组合无法组成总金额,返回-1
if(amount < 0)
//恰好组成总金额
return -1;
if(amount == 0)
return 0;
//amount金额的最小硬币个数已经计算过了,直接返回就好
if(count[amount])
return count[amount];
int Min = INT_MAX;
for(auto coin : coins){
//用循环计算,如果使用当前金额的一枚硬币后的总硬币个数
int res = dp(coins, amount - coin) + 1;
//res <= 0代表不能组成总金额,res > Min代表不是最少的硬币个数
if(res > 0 && res < Min)
Min = res;
}
//如果Min更改过代表存在一种组合满足条件
return count[amount] = Min == INT_MAX ? -1 : Min;
}
};
Accepted
188/188 cases passed (68 ms)
Your runtime beats 74.36 % of cpp submissions
Your memory usage beats 17.11 % of cpp submissions (15.4 MB)