给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
输入:coins =[1, 2, 5]
, amount =11
输出:3
解释:11 = 5 + 5 + 1
示例 2:
输入:coins =[2]
, amount =3
输出:-1
示例 3:
输入:coins = [1], amount = 0 输出:0
int coinChange(int* coins, int coinsSize, int amount) {
//定义数组用来存放1到amount金额所需的最少硬币数
int dp[amount+1];
//由于题目要求如果没有任何一种硬币组合能组成总金额,返回 -1 。
//所以将数组初始值赋值为-1,
for(int i=1;i<amount+1;i++){
dp[i]=-1;
}
//当金额为0时,所需硬币为0
dp[0]=0;
//外层循环遍历每一个金额
for(int i=1;i<=amount;i++){
//内层循环遍历每一个硬币金额
for(int j=0;j<coinsSize;j++){
//如果当前硬币金额小于等于所求金额,且硬币金额和为所求金额
if(coins[j]<=i&&dp[i-coins[j]]!=-1){
//进行判断,满足上述条件时,当前金额所需硬币数为-1,既无解
//且并不是最少硬币数时,进行值覆盖,直到所有硬币金额都被遍历
if(dp[i]==-1||(dp[i]>dp[i-coins[j]]+1)){
dp[i]=dp[i-coins[j]]+1;
}
}
}
}
return dp[amount];
}