以下は、お金のすべての組み合わせを見つけるためのpythonプログラムです。これは、order(n)時間の動的プログラミングソリューションです。お金は1,5,10,25
行マネー1から行マネー25(4行)までトラバースします。行money 1には、組み合わせの数を計算する際にmoney 1のみを考慮した場合のカウントが含まれます。行マネー5は、同じ最終通貨の行マネーrのカウントと、その行の前の5カウント(現在の位置から5を引いたもの)を足して、各列を生成します。ローマネー10は、ローマネー5を使用します。これには、1,5の両方のカウントが含まれ、前の10カウント(現在の位置から10を引いたもの)が追加されます。ローマネー25はローマネー10を使用します。これには、ローマネー1、5、10のカウントと前の25カウントが含まれます。
たとえば、numbers [1] [12] = numbers [0] [12] + numbers [1] [7](7 = 12-5)の場合、3 = 1 + 2となります。数値[3] [12] =数値[2] [12] +数値[3] [9](-13 = 12-25)。-13は0より小さいため、4 = 0 + 4になります。
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)