Python 面试题
给定数量不限的纸币,面值分别是 25 元、10 元、5 元、1 元、请计算 n 元(n>=1)所有的纸币组合方法,并用列表输出。
如:5 元时输出 [1, 1, 1, 1, 1]、[5]
动态规划
def calculate(n: int, face_values: list):
    """计算
    :param n: 需要计算的金额
    :param face_values: 面值集合
    :return: 所有组合
    """
    face_values.sort(reverse=True)
    results = []
    for face in face_values:
        if face > n:
            continue
        if face == n:
            results.append(face)
            continue
        _result = [face]
        _n = n - face
        _face_values = face_values[face_values.index(face):] or [1]
        result = combination(_n, _face_values)
        results.append(_result + result)
        _face_values = face_values[face_values.index(face) + 1:] or [1]
        while result:
            _result_start = result.pop(0)
            if _result_start == 1:
                _result.append(_result_start)
                continue
            result = combination(_result_start, _face_values) + result
            results.append(_result + result)
    return results
def combination(n, _face_values: list):
    """面值组合
    :param n: 需要计算的金额
    :param _face_values: 面值集合
    :return: 所有组合
    """
    if n == 1:
        return [1]
    result = []
    for face in _face_values:
        if face >= n:
            continue
        if n - face == 0:
            result.extend((n, face))
            return result
        result.append(face)
        result.extend(combination(n - face, _face_values))
        return result
for i in calculate(26, [25, 10, 5, 1]):
    print(i)