每日一题:LeetCode-322. 零钱兑换
刷题使我快乐,满脸开心.jpg
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数
。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
复制代码
示例 2:
复制代码
示例 3:
复制代码
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104
思路
最开始看到题目,直接就开始呼贪心代码,然后写完之后,发现会超时(后来看题解时候,发现开始还是有贪心剪枝可以过的,后来更新了用例就不得行了...)
那就换思路!然后就想到了这个感觉很像爬楼梯,类比下就是:
我们每一次只能爬
coins
中给定数字个台阶,直到爬到指定的台阶数,然后求得最少爬台阶次数。
那顺着这个思路,就上动态规划吧:
dp[i]
表示amount 为
i` 时,最少爬台阶次数初始条件为
dp[0] = 0
剩下就没啥要说的了,上代码,有个剪枝细节在备注里了~
代码
动态规划
复制代码
贪心
复制代码
欢迎关注公众号查看更多题目~
版权声明: 本文为 InfoQ 作者【半亩房顶】的原创文章。
原文链接:【http://xie.infoq.cn/article/637c60c3a904139a21a21a9e5】。文章转载请联系作者。
评论