代码仓库:Github | Leetcode solutions @doubleZ0108 from Peking University.
-
解法1(超时): 递归,自上而下,例如我有三种币值1 2 5,那么n的最少兑换次数 = min(1+n-1, 1+n-2, 1+n-5)
- 改进(超时):加入memo,把之前算过的存起来
-
解法2(T58% S61%): 动态规划,自下而上,把 1,2,…amount 每个面值需要的数量都算出来
- 注意要判断当前coin的合法性(是不是比所需的amount小)
this_count = 1+dp[i-count] min_count = min(min_count, this_count)
class Solution(object):
def coinChange(self, coins, amount):
"""
:type coins: List[int]
:type amount: int
:rtype: int
"""
if amount == 0: return 0
if amount in coins: return 1
if amount<min(coins): return -1
INF = 1e06
dp = [INF for _ in range(amount+1)]
for c in coins:
if c < amount:
dp[c] = 1
for i in range(amount+1):
if dp[i] == INF:
for coin in [c for c in coins if c<=i]:
dp[i] = min(dp[i], 1+dp[i-coin])
return dp[i] if dp[i]!=INF else -1
# 一直超时 不保证正确
def otherSolution(self, coins, amount):
if len(coins) == 1:
if amount % coins[0] == 0:
return amount // coins[0]
else:
return -1
# 解法1
# 改进1
min_table = [-1 for _ in range(amount)]
def coinCount(coins, amount):
if not coins:
return -1
if amount <= 0:
return 0
if amount in coins:
return 1
if min_table[amount-1] != -1:
return min_table[amount-1]
min_coin_change = -1
for coin in coins:
if coin == amount:
min_coin_change = 1
break
elif coin > amount:
continue
else:
this_change = coinCount([c for c in coins if c<=amount-coin], amount-coin)
if this_change >= 1:
if min_coin_change == -1:
min_coin_change = 1 + this_change
else:
min_coin_change = min(min_coin_change, this_change+1)
if min_table[amount-1] == -1:
min_table[amount-1] = 1+this_change
else:
min_table[amount-1] = min(min_table[amount-1], this_change+1)
return min_coin_change
return coinCount(coins, amount)
这篇博客探讨了如何使用动态规划方法解决寻找最小硬币组合的问题。作者提供了两种解法,一种是递归优化,另一种是标准动态规划方案。代码实现包括了两种解法,并针对超时问题进行了优化。文章还包含了对解法的详细解释和讨论。
163

被折叠的 条评论
为什么被折叠?



