动态规划-leetcode-518

121 阅读1分钟

0️⃣python数据结构与算法学习路线
学习内容:

  • 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…
  • 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等…

题目:

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

输入输出:

输入: amount = 5, coins = [1, 2, 5]
输出: 4
解释: 有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

解题思路:

可以重复按使用,完全背包问题
状态方程:dp[i]+=dp[i-num]

算法实现:

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 num in coins:
            for i in range(num,amount+1):# 已经是第二次忘记可以把num放进去就不用if i>num判断了
                    dp[i]+=dp[i-num]
        return dp[-1]

出现问题:

1.问题分类
在这里插入图片描述