给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个正数aim 代表要找的钱数,求换钱有多少种方法。
以下是我的python3 版本的答案:
money_array = [1,2,4]
aim =3
def force_search(array,index,aim):
if index ==len(array):
if aim ==0:
return 1
#表示的是前面的系数组成是否可以构成一个==aim的解 ax+by+cz = aim (a,b,c) 系数成立返回1
else:
return 0
else:
result =0
i =0
while array[index]*i <= aim:
money_left = aim - array[index]*i
result += force_search(array=array,index=index+1,aim=money_left)
i+=1
return result
result = force_search(array=money_array,index=0,aim=aim)
print(result)
我最初的思路也是递归查找,但是不明白界限为什么是 len(array),理论上超过len(array) -1 就越界了。
冥思苦想明白了。len(array) 是给多层 i 赋值 之后 (也就是注释种说的 (a,b,c) 组),进行判断 递归中的i 组合能否实现等式 (i a+i b+i c)= aim i 是层层递进的。这里用数学等式也许会更好理解。第一次写,写的不好还请多多包涵