描述
给定数组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]

该博客介绍了一种使用动态规划解决找零问题的方法。给定一组不同面值的正整数货币和一个目标金额,目标是找出组成该金额所需的最少货币数量。博主通过创建一个动态规划数组来跟踪最少货币数,并遍历所有可能的面值,更新数组以找到最优解。示例包括了不同情况下的解决方案,如无法组成目标金额时返回-1。
425

被折叠的 条评论
为什么被折叠?



