【
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/coin-change
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
此题用贪心会有问题,得用动态规划。
此题让我知道原来动态规划可以这样用,if条件中dp[i] > dp[i-value] + 1,那么转态转移方程:dp[i] = dp[i-value] + 1。
int coinChange(int* coins, int coinsSize, int amount){
int i;
int dp[amount+1];
int count = amount;
int j;
int value;
memset(dp, -1, (amount + 1) * sizeof(int));
dp[0] = 0;
for(i = 0; i <= amount; i++) {
for(j = 0; j < coinsSize; j++) {
value = coins[j];
if((i >= value) && (dp[i-value] != -1)) {
if((dp[i] == -1) || (dp[i] > dp[i-value] + 1)) {
dp[i] = dp[i-value] + 1;
}
}
}
}
return dp[amount];
}