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)
© 2022 刘士. All rights reserved.

结果匹配 ""

    没有匹配的结果 ""