硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)

示例1:

输入: n = 5
输出:2
解释: 有两种方式可以凑成总金额:
5=5
5=1+1+1+1+1

示例2:

输入: n = 10
输出:4
解释: 有四种方式可以凑成总金额:
10=10
10=5+5
10=5+1+1+1+1+1
10=1+1+1+1+1+1+1+1+1+1
说明:

注意:
你可以假设:

  • 0 <= n (总金额) <= 1000000

Python 解答:
1.动态规划,由于j只和前一行有关,可以用滚动数组优化。


class Solution:
    def waysToChange(self, n: int) -> int:
        arr = [1, 5, 10, 25]
        matrix = [[0 for i in range(n+1)] for j in range(len(arr))]
        for i in range(n+1):
            matrix[0][i] = 1
        for j in range(len(arr)):
            matrix[j][1] = 1
        for j in range(1, len(arr)):
            for i in range(2, n+1):
                if i-arr[j] > 0:
                    matrix[j][i] = (matrix[j-1][i] + matrix[j][i-arr[j]])%1000000007
                elif i-arr[j] == 0:
                    matrix[j][i] = matrix[j-1][i] + 1
                else:
                    matrix[j][i] = matrix[j-1][i]
        return matrix[len(arr)-1][n]

2.只有4种可以通过数学展开

3.回溯法,不过会超时

class Solution:
    def waysToChange(self, n: int) -> int:
        count = 0
        arr = [25, 10, 5, 1]
        def dfs(n, pre):
            if n < 0:
                return
            elif 0 <= n < 5:
                nonlocal count
                count += 1
                return
            for item in arr:
                if item <= pre:
                    n -= item
                    dfs(n, item)
                    n += item
        dfs(n, 30)
        return count%1000000007
最后修改日期: 2021年5月5日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。