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)