难度中等709收藏分享切换为英文关注反馈
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1
。
示例 1:
输入: coins =[1, 2, 5]
, amount =11
输出:3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins =[2]
, amount =3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。
通过次数107,047提交次数264,523
解题思路:dp数组表示: dp[i]: 向量coins中硬币拼成金额 i 的所需硬币个数
状态转移方程:dp[i] = min(dp[ i ],dp[ i-coin ]+1) ;(当i>=coin时 )
AC代码如下:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if(coins.size()==0)
return 0;
if(amount<=0)
return 0;
int dp[amount+1];// dp[i] 向量coins中硬币拼成金额 i 的所需硬币个数
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(int i=1;i<=amount;i++){
for(int j=0;j<coins.size();j++){
int coin=coins[j];
if(i>=coin){
int count=dp[i-coin]+1;
if(count==0) //当前遍历到的 coin 无法拼成 i
continue;
else{
if(dp[i]==-1)
dp[i]=count;
else
dp[i]=min(dp[i],count);
}
}
}
}
return dp[amount];
}
};