BM70 兑换零钱(一)

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

描述
给定数组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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值