此题解采用动态规划类似的方法,但优化了空间复杂度。首先,考虑最大的硬币25分,从0枚到最多可能的枚数遍历,每次减去25分硬币占的总额后,计算剩余金额可以由10分和5分硬币组合的方式。这里利用了组合数学中的简单排列组合原理,即固定某些硬币后,其余硬币的组合方式数量。对于每个i(25分硬币的数量),计算剩余金额可以由10分硬币最多可以有多少枚(a),以及5分硬币最多可以有多少枚(b)。然后用组合方式计算这些硬币可以组合成剩余金额的方法数。最后,所有可能的i的总和即为答案。
时间复杂度: O(n/25) 或简化为 O(n)
空间复杂度: O(1)
class Solution:
def waysToChange(self, n: int) -> int:
ans = 0
for i in range(n // 25 + 1): # 遍历每种可能的25分硬币的数量
rest = n - i * 25 # 计算去掉25分硬币后剩余的金额
a, b = rest // 10, rest % 10 // 5 # 计算剩余金额中10分和5分硬币的最大可能数量
ans += (a + 1) * (a + b + 1) # 计算当前25分硬币数量下的总组合数
return ans % 1000000007 # 返回结果,同时取模防止数字过大