给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
数据范围:数组大小满足
, 数组中每个数字都满足
,
要求:时间复杂度
,空间复杂度
。
[5,2,3],20
4
[5,2,3],0
0
[3,5],2
-1
class Solution: def minMoney(self , arr: List[int], aim: int) -> int: # write code here aim_list = [aim+1]*(aim+1) aim_list[0] = 0 for i in range(1, aim+1): for j in arr: if j <= i: # 可以找零 aim_list[i] = min(aim_list[i], aim_list[i-j]+1) if aim_list[aim] == aim+1: # 无法找零 return -1 return aim_list[aim]
class Solution: def minMoney(self , arr: List[int], aim: int) -> int: # write code here #d[i]=min(d[i1],d[i2],d[d3])+1 #d[20]=min(d[15],d[18],d[17])+1 dp=[float("Inf")]*(aim+1) dp[0]=0 for coin in arr: for i in range(coin,aim+1): dp[i]=min(dp[i],dp[i-coin]+1) return dp[aim] if dp[aim]!=float("Inf") else -1
class Solution: def minMoney(self , arr , aim ): # write code here dp = [float("inf")]*(aim+1) dp[0] = 0 for i in range(len(arr)): for j in range(arr[i], aim+1): dp[j] = min(dp[j], dp[j-arr[i]]+1) return dp[-1] if dp[-1] != float('inf') else -1