1. FlyPython首页
  2. 数据结构与算法
  3. leetcode题解

「LeetCode每日一题」—— LCCI.08.11. 硬币

LCCI.08.11. 硬币

链接:https://leetcode-cn.com/problems/coin-lcci/
难度:中等

题目

点击原文链接跳转查看题目

思路

这题是完全背包问题,因为每种硬币的数量都是无限。

我们用动态规划来做,设dp[i][j]为遍历到当下这个硬币时,组成金额j的方法数目。
在后面我们有两种可能

1.当前硬币没有取,dp[i][j] = dp[i-1][j]
2.当前硬币取了,dp[i][j] = dp[i][j-coins[i[]]

状态转移方程:

dp[i][j]=dp[i-1][j]+dp[i][j-coins[i]]

上面的转移方程可以把第一个维度去掉,变成:

dp[j]=dp[j]+dp[j-coins[i]]

然后设置初始化条件dp[0]=1,代表0(没有硬币)也是一种情况。

代码见解决方案。

方案代码

解决方案:

class Solution:
    def waysToChange(self, n: int) -> int:
        coins = [1, 5, 10, 25]
        dp = [0] * (n + 1) 
        dp[0] = 1
        for coin in coins :
            for i in range(coin, n + 1) :
                dp[i] = dp[i] + dp[i - coin]
        return dp[n] % 1000000007

原创文章,作者:flypython,如若转载,请注明出处:http://flypython.com/algorithm/leetcode/348.html