给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。
暴力递归
dp 函数的定义:当前的目标金额是 n,至少需要 dp(n) 个硬币凑出该金额。
dp(n)
= 0, n=0
=-1, n<0
= min{dp(n-coin) +1| coin属于coins}, n>0
时间复杂度分析:⼦问题总数 x 每个⼦问题的时间。
⼦问题总数为递归树节点个数,这个⽐较难看出来,是 O(n^k),总之是指数级别的。每个⼦问题中含有⼀个 for 循环,复杂度为 O(k)。所以总时间复杂度为 O(k * n^k),指数级别
class Solution {
public int coinChange(int[] coins, int amount) {
return dp(coins, amount);
}
public int dp(int[] coins, int n){
if(n==0) return 0;
if(n< 0) return -1;
//res记录 选择硬币的方案中 较小的值
int res= Integer.MA