初学python记录:力扣518. 零钱兑换 II

本文介绍了一道编程问题,涉及计算给定总金额和不同面额硬币的情况下,所有可能凑出总金额的硬币组合数量。利用动态规划方法,通过状态转移方程dp[i]=dp[i-x]+dp[i]实现,最后返回dp[amount]作为结果。
摘要由CSDN通过智能技术生成

题目:

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。

思考:

这题跟昨天的很类似,区别在于昨天要找最少的硬币数组合,今天是计算所有可能的硬币组合数量。同样的,用f(i)表示能组成金额i的硬币组合数量,对于所有硬币面额x,i都能由(i-x)+x组成,所以对每个x来说,凑出i的组合数量即(1-x)的组合数量。总的f(i)即为f(i-x)的总和,公式如下:

f(i) = \sum_{x \epsilon coins}^{} f(i-x)

代码如下:

class Solution(object):
    def change(self, amount, coins):
        """
        :type amount: int
        :type coins: List[int]
        :rtype: int
        """
        dp = [0] * (amount+1)
        dp[0] = 1
        for x in coins:
            for i in range(x, amount+1):
                dp[i] += dp[i-x]
        return dp[amount]

提交通过:

 

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值