问题
有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。
给定数组penny及它的大小(小于等于50),同时给定一个整数aim,请返回有多少种方法可以凑成aim。
测试样例:
[1,2,4],3,3
返回:2
思路
dp[i][j]
表示使用前
i
种货币,构成钱数为
dp[i][j]={dp[i][j−penny[i]]+dp[i−1][j],j>penny[i]dp[i−1][j],j<penny[i]
代码
class Exchange:
def countWays(self, penny, n, aim):
# write code here
dp = [[0 for i in range(aim + 1)] for _ in range(n)]
for i in range(n):
for j in range(aim + 1):
if i == 0:
dp[i][j] = 1 if j % penny[i] == 0 else 0
elif penny[i] > j:
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = dp[i][j - penny[i]] + dp[i-1][j]
return dp[n-1][aim]