给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
说明:你可以认为每种硬币的数量是无限的。
链接:https://leetcode-cn.com/problems/coin-change
解题思考:
硬币问题可以用数学表述成如下形式:
在不断的迭代dp()中,当出现n-coin==0时,兑换零钱加一次。
从递归的迭代过程思考,可以画出迭代树表示,例如假设amount=9,coins={1,2,5}
图中相同颜色的色块是在迭代过程中重复计算的部分。
方法1:递归
递归算法的时间复杂度分析:子问题总数 x 每个子问题的时间。
子问题总数为递归树节点个数,这个比较难看出来,是 O(n^k),总之是指数级别的。每个子问题中含有一个 for 循环,复杂度为 O(k)。所以总时间复杂度为 O(k * n^k),指数级别
class So