您的位置:首页 > 编程语言 > Python开发

322. Coin Change -Medium

2017-02-06 20:14 253 查看

Question

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

给你一组不同面额的钱以及资金总额。找到使用硬币组合成该资金总额的最少数量。如果没法组合得到,返回-1

Example

coins = [1, 2, 5], amount = 11

return 3 (11 = 5 + 5 + 1)

coins = [2], amount = 3

return -1.

Solution

动态规划解。定义dp[i]:使用硬币组合成资金总额i的最少数量,递推关系式:dp[i] = min(dp[i - coin]) + 1 (coin in coins)。因为dp[i]都需要加上硬币面额中的一个(当然硬币面额一定要小于资金总额),所以我们只要找出到底加上哪个硬币面额使用硬币数量最少即可。对于没法组合得到的资金总额,我们只需初始化的时候设置一个固定较大值,它并不会被更新到

class Solution(object):
def coinChange(self, coins, amount):
"""
:type coins: List[int]
:type amount: int
:rtype: int
"""
dp = [0] + [amount + 1] * amount
for a in range(1, amount + 1):
for c in coins:
# 只对小于amount的硬币进行判断
if a >= c:
dp[a] = min(dp[a], dp[a - c] + 1)
# 如果amount不能被硬币组合得到,那么它对应的d[amount]不会更新
return dp[amount] if dp[amount] != amount + 1 else -1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息