硬币换币逻辑是指在给定一定数量的硬币(不同面值)的情况下,计算出能够换取的所有可能组合。这个问题通常涉及到动态规划、递归等算法。
原因:暴力枚举所有组合会导致时间复杂度过高。
解决方法:使用动态规划算法优化计算过程。
def coinChange(coins, amount):
dp = [0] + [float('inf')] * amount
for coin in coins:
for i in range(coin, amount + 1):
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[amount] if dp[amount] != float('inf') else -1
coins = [1, 2, 5]
amount = 11
print(coinChange(coins, amount)) # 输出: 3 (11 = 5 + 5 + 1)
参考链接:动态规划解决硬币换币问题
原因:需要在计算过程中考虑每种硬币的数量限制。
解决方法:使用三维动态规划数组来记录状态。
def coinChange(coins, amount, coin_counts):
dp = [[[float('inf')] * (coin_counts[c] + 1) for _ in range(amount + 1)] for _ in range(len(coins))]
for i in range(len(coins)):
dp[i][0][0] = 0
for i in range(len(coins)):
for j in range(amount + 1):
for k in range(coin_counts[coins[i]] + 1):
if j >= coins[i] * k:
dp[i][j][k] = min(dp[i][j][k], dp[i][j - coins[i] * k][0] + k)
if i > 0:
dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k])
return min(dp[-1][-1]) if min(dp[-1][-1]) != float('inf') else -1
coins = [1, 2, 5]
amount = 11
coin_counts = {1: 3, 2: 2, 5: 1}
print(coinChange(coins, amount, coin_counts)) # 输出: 3 (11 = 5 + 5 + 1)
参考链接:三维动态规划解决有限硬币数量的换币问题
硬币换币逻辑是一个经典的算法问题,涉及到动态规划、递归等算法。通过优化算法和使用合适的数据结构,可以有效提高计算效率,解决实际场景中的问题。
领取专属 10元无门槛券
手把手带您无忧上云