# 暴力递归defminForm(arr, p, aim):if p ==len(arr):return1if aim ==0else0
res =0
i =0while arr[p]*i <= aim:
res += minForm(arr, p+1, aim-arr[p]*i)
i +=1return res
# 动态规划defminForms(arr, aim):
m =[[0for i inrange(aim+1)]for j inrange(len(arr))]# 初始化m表
j =len(arr)
i =0while arr[j-1]*i <= aim:
m[j-1][arr[j-1]*i]=1
i +=1for i inrange(j):
m[i][0]=1# complete the m form
i =len(arr)-2while i >=0:for j inrange(1,aim+1):if j - arr[i]>=0:
m[i][j]+= m[i][j-arr[i]]if i +1<len(arr):
m[i][j]+= m[i+1][j]
i -=1print('m表:')for item in m:print(item)return m[0][aim]if __name__ =="__main__":
arr =[5,10,25,1]
aim =15print('暴力递归方法结果:{0}'.format(minForm(arr,0, aim)))print('动态规划方法结果:{0}'.format(minForms(arr, aim)))