此博客链接:https://www.cnblogs.com/ping2yingshi/p/13760948.html
零钱兑换
题目链接:https://leetcode-cn.com/problems/coin-change/submissions/
给定不同面额的硬币 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
示例 4:
输入:coins = [1], amount = 1
输出:1
示例 5:
输入:coins = [1], amount = 2
输出:2
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 231 - 1
题解:
思路:
1.如果钱的面值比零钱的最小值还小,这是不能兑换零钱的。
2.如果当前的钱数大于等于最大的零钱,当前的值减去最大的零钱数,记录兑换零钱数为1,比较剩下的钱,看是否比最大的零钱大,如果比最大的零钱大,剩下的前减去最大零钱数,兑换零钱数加1,直到剩下的钱小于最大的零钱数,剩下的零钱数和第二个大的零钱数做比较,直到剩下0元钱,记录一共兑换多少次零钱。
注意,上面忘记考虑,手里还剩钱,但是不能由零钱兑换了,这说明不能兑换零钱,应该返回-1.
修改程序,发现又忘记一种情况,是当前零钱是0,意思是不需要兑换零钱,所以应该返回0.
坑点,给的兑换零钱不一定是按从小到大的顺序排列的,需要自己先对数组排序。
再次运行程序,又发现新的错误,这次发现上面思路都是错的,上面尽可能选择最大的,但是把最大的选完后,会出现两种情况,
1.小的数可能零钱不够兑换,返回结果就是-1,
coins:[ 4, 5]
amount:28
若按照我之前的贪心来计算,结果应该是28 = 5 + 5 + 5 + 5 + 5 + 3
返回-1,然而正确的是28=5+5+5+5+4+4
2.可以不需要最小的零钱兑换
coins:[1, 4, 5]
amount:28
若按照计算,结果应该是28 = 5 + 5 + 5 + 5 + 5 + 1 + 1 + 1,8枚
然而实际的最小数应该是28 = 5 + 5 + 5 + 5 + 4 + 4,6枚
所以上面按照最大的取法是错误的。