LeetCode 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
解法
动态规划
解题思路
以用例一作为例子模拟一下dp数组不断“完善”的过程,当只是要coins[0]作为兑换硬币时,得到数组dp1,再加入coins[1]和coins[2]后有分别得到dp2、dp[3]。在每轮遍历coins[j]的过程中,如果i > coins[j]就进行dp[i] = min(dp[i],dp[i - coins[j]] + 1)操作,不断迭代dp,最后得到最终数组dp,就是兑换硬币问题的答案。

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector <float> dp(amount + 1,INT_MAX); //此处使用float类型,方便赋无穷大值dp[0] = 0;for(int i = 0;i <= amount;i ++){for(int j = 0;j < coins.size();j ++){if(i >= coins[j]){dp[i] = min(dp[i],dp[i - coins[j]] + 1);}}}return dp[amount] == INT_MAX ? -1 : dp[amount];}
};时间复杂度O(N^2),空间复杂度O(N)
