下面是一个python程序,用于查找所有货币组合。这是一个具有order(n)时间的动态编程解决方案。钱是1,5,10,25
我们从第1行货币遍历到第25行货币(4行)。如果我们在计算组合数时仅考虑货币1,则行货币1包含计数。行货币5通过获取相同最终货币的行货币r的计数加上其自己行中的前5个计数(当前位置减去5)来产生每一列。行货币10使用行货币5,行货币5包含两个1,5的计数,并加上前10个计数(当前头寸减去10)。行货币25使用行货币10,其中包含行货币1,5,10的计数加上前25个计数。
例如,数字[1] [12] =数字[0] [12] +数字[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)