题目
描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
数据范围:数组大小满足 0≤n≤10000 , 数组中每个数字都满足 0<val≤10000,0≤aim≤5000
要求:时间复杂度 O(n×aim) ,空间复杂度 O(aim)。
思路
采用动态规划的思路一步步走,要凑到11块钱,考虑凑11-1 11-2 11-5块需要多少个硬币。
代码
python版本:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 最少货币数
# @param arr int整型一维数组 the array
# @param aim int整型 the target
# @return int整型
#
class Solution:
def minMoney(self , arr: List[int], aim: int) -> int:
# write code here
dp = [aim+1 for i in range(aim+1)]
dp[0] = 0
for i in range(aim+1):
for cv in arr:
if cv<=i:
dp[i] = min(dp[i-cv]+1, dp[i])
if dp[aim] == (aim + 1):
return -1
else:
return dp[aim]
c++版本:
无