换钱的最少货币数

换钱的最少货币数

http://www.nowcoder.com/questionTerminal/3911a20b3f8743058214ceaa099eeb45

有点难理解,其实还是递归,https://www.jianshu.com/p/b9d7ff91684e

i: 代表可以使用的货币种类为 arr[0..i]
j: 代表需要兑换的面值数,其取值范围为[0..aim],因此实现时,二维数组的列数应该为aim + 1
对于dp[i][j],更新的依据有两个值,一个是“不使用当前种类的货币时,组成总数的j的最小方法,即dp[i-1][j]”,另外一个是“使用并且仅使用一张当前种类的货币时,组成总数的j的最小方法,即 dp[i][j-arr[i]] + 1”,取这两个值中的最小值即为dp[i][j]的值。
上面的实现,需要的空间复杂度是O(N * aim),下面的方法,可以将空间复杂度优化到O(aim)。
优化方法:
生成一个一维动态规划数组dp[aim + 1]
构造初始值:参考上面的方法,初始值表示只使用arr[0]一种货币时,兑换[0..aim]的最少货币数。
更新动态规划表:更新方向,从左到右更新。对于dp[j],更新的依据有两个,一个是 dp[j](old),换算成二维数组,即为不使用arr[j]货币时的最少货币数,即为dp[line-1][j]。另外一个是dp[j-arr[j]] + 1,即为“使用并且仅使用一张当前种类的货币时的最少货币数”,换算成二维数组,即为dp[line][j-arr[j]] + 1.

#
# 最少货币数
# @param arr int整型一维数组 the array
# @param aim int整型 the target
# @return int整型
#
class Solution:
    def minMoney(self, arr, aim):
        # write code here
        N=len(arr)
        dp = [float('inf')]*(aim+1)
        dp[0] = 0
        for i in range(1, aim+1):
            for j in range(N):
                if i < arr[j]:
                    continue
                dp[i] = min(dp[i], dp[i-arr[j]]+1)                
        if dp[aim] == float('inf'):
            return -1 
        else:
            return dp[aim] 
全部评论

相关推荐

暴走萝莉莉:这是社招场吧,作为HR说个实话:这个维护关系的意思是要有政府资源,在曾经的工作中通过人脉资源拿下过大订单的意思。这个有相关管理经验,意思也是真的要有同岗位经验。应酬什么的对于业务成交来说就算不乐意也是常态,就是要求说话好听情商高,酒量好。
点赞 评论 收藏
分享
霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
评论
6
收藏
分享
牛客网
牛客企业服务