关键还是在于找到状态转移方程,设dp[i]为i块钱最少需要几张货币来兑换,于是可以想到状态转移方程为:
设最小的面试的货币是minv,也就是需要从minv遍历到aim,因为小于minv的aim是不可能兑换成功的。
此外注意下边界条件就可以了,代码如下:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 最少货币数
# @param arr int整型一维数组 the array
# @param aim int整型 the target
# @return int整型
#
class Solution:
def minMoney(self , arr, aim: int) -> int:
# write code here
if len(arr) == 0:
return -1
minv = min(arr)
if aim < minv:
return 0
# 初始化dp
dp = [5001]*(aim+1)
for i in range(minv , aim+1):
if i == minv:
dp[i] = 1
else:
if i in arr:
dp[i] = 1
else:
min_num = 5001
for _ in arr:
if i - _ >= minv and dp[i - _]+1 < min_num:
min_num = dp[i - _] + 1
dp[i] = min_num
if dp[aim]>5000:
return -1
else:
return dp[aim]
arr = [5,2,3]
aim = 20
print(Solution().minMoney(arr,aim))