아래는 모든 돈 조합을 찾는 파이썬 프로그램입니다. 이것은 order (n) 시간이있는 동적 프로그래밍 솔루션입니다. 돈은 1,5,10,25
행 돈 1에서 행 돈 25 (4 행)로 이동합니다. 조합 수를 계산할 때 돈 1 만 고려하는 경우 행 돈 1에는 개수가 포함됩니다. 행 돈 5는 동일한 최종 돈에 대해 행 돈 r의 수와 자체 행의 이전 5 수 (현재 위치에서 5를 뺀 값)를 더하여 각 열을 생성합니다. 행 돈 10은 행 돈 5를 사용하는데, 여기에는 1,5에 대한 개수가 포함되어 있고 이전 10 개수에 추가됩니다 (현재 위치에서 10을 뺀 값). 행 돈 25는 행 돈 1,5,10에 이전 25 개 수를 더한 수를 포함하는 행 돈 10을 사용합니다.
예를 들어, numbers [1] [12] = numbers [0] [12] + numbers [1] [7] (7 = 12-5), 결과는 3 = 1 + 2; 숫자 [3] [12] = 숫자 [2] [12] + 숫자 [3] [9] (-13 = 12-25), 결과는 4 = 0 + 4입니다. -13은 0보다 작기 때문입니다.
def cntMoney(num):
mSz = len(money)
numbers = [[0]*(1+num) for _ in range(mSz)]
for mI in range(mSz): numbers[mI][0] = 1
for mI,m in enumerate(money):
for i in range(1,num+1):
numbers[mI][i] = numbers[mI][i-m] if i >= m else 0
if mI != 0: numbers[mI][i] += numbers[mI-1][i]
print('m,numbers',m,numbers[mI])
return numbers[mSz-1][num]
money = [1,5,10,25]
num = 12
print('money,combinations',num,cntMoney(num))
output:
('m,numbers', 1, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
('m,numbers', 5, [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3])
('m,numbers', 10, [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 4, 4, 4])
('m,numbers', 25, [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 4, 4, 4])
('money,combinations', 12, 4)