本文主要是介绍【LeetCode热题100】322. 零钱兑换(动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.题目要求
给你一个整数数组 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
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104
四.解题思路
枚举每种可能选择的合法面额,dp[i]表示兑换i金额最少的硬币个数。
d p [ i ] = m i n ( 不选该面额所需最少的硬币个数, 1 (表示选该面额) + i 减去该面额剩下的金额所需最少硬币个数) dp[i] = min (不选该面额所需最少的硬币个数,1(表示选该面额) + \,i\,减去该面额剩下的金额所需最少硬币个数) dp[i]=min(不选该面额所需最少的硬币个数,1(表示选该面额)+i减去该面额剩下的金额所需最少硬币个数)
最后判断有无满足条件的选法并返回。
五.代码实现
class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);dp[0] = 0;for (int a = 1; a <= amount; a++) {for (int coin : coins) {if (coin <= a) {if (dp[a - coin] >= 0 && dp[a - coin] < INT_MAX)dp[a] = min(dp[a], dp[a - coin] + 1);}}}return dp[amount] == INT_MAX ? -1 : dp[amount];}
};
六.题目总结
–
这篇关于【LeetCode热题100】322. 零钱兑换(动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!