コインコインの異なる宗派や金額の合計額を考えます。私たちは、合計金額を構成するために必要なコインの最小数を計算するための関数を書くことができます。コインの合計金額のいずれかで構成することができない組み合わせがない場合、-1を返します。
例1:
入力:コイン= [1、2、 5]、量= 11
出力:3
解説:11 = 5 + 5 + 1
例2:
入力:コイン= [2]、量 = 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]
}