描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
数据范围:数组大小满足 0≤n≤10000 , 数组中每个数字都满足 0<val≤10000,0 ≤aim≤5000
要求:时间复杂度 O(n×aim) ,空间复杂度 O(aim)。
示例1
输入:
[5,2,3],20
返回值:
4
示例2
输入:
[5,2,3],0
返回值:
0
示例3
输入:
[3,5],2
返回值:
-1
#
# 最少货币数
# @param arr int整型一维数组 the array
# @param aim int整型 the target
# @return int整型
#
class Solution:
def minMoney(self , arr , aim ):
# write code here
if len(arr) == 0:
return -1
if aim == 0:
return 0
# dp[i] 表示组成面值为 i 的货币 需要最少的货币数
dp = [aim+1 for i in range(aim+1)]
dp[0] = 0
for i in range(1, aim+1):
for x in arr:
if i >= x and dp[i] > dp[i-x]+1:
dp[i] = dp[i-x]+1
if dp[aim] == aim+1:
return -1
else:
return dp[aim]