给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。
思路
动态规划。
我的解答
func coinChange(coins []int, amount int) int {
if amount==0{//0元不需要硬币
return 0
}
cnt:=make([]int,amount+1)//初始化切片,cnt(i)表示i块钱所需的硬币数
for _,v:=range coins{ //0是默认状态,表示无法凑成。
if amount>=v{
cnt[v]=1 //凑硬币面值只需一枚硬币
}
}
for i:=1;i<=amount;i++{
if cnt[i]==0{//如果当前金额未计算
for _,v:=range coins{//对于每个硬笔面值
if v<i&&cnt[i-v]>0{//i-v可以凑成
if cnt[i]==0{//cnt为默认值则直接记录
cnt[i]=cnt[i-v]+1
}else if cnt[i-v]+1<cnt[i]{//若新硬币数更少则更新cnt
cnt[i]=cnt[i-v]+1
}
}
}
}
}
if cnt[amount]==0{//0表示不得凑成
return -1
}
return cnt[amount]
}