leetcode322.零钱兑换
基本思路
回溯算法的应用
1.循环(金额减去银币面额,银币)
2.凑不齐面额的忽略,能凑齐面额的组合取银币数最少的
3.重复执行1,2步骤,所有组合都被触发。别忘了用备忘录减少不必要的重复极损
解法代码
func coinChange(coins []int, amount int) int {
memo:=make([]int,amount+1)
for k,_:=range memo{
memo[k]=666
}
return dp(coins,amount,memo)
}
func dp(coins []int,amount int, memo []int) int{
if amount==0{
return 0
}
if amount< 0{
return -1
}
if memo[amount]!=666{
return memo[amount]
}
res:=math.MaxInt
for _, v:=range coins{
sub:=dp(coins,amount-v,memo)
if sub==-1{
continue
}
res=min(res,sub+1)
}
if res==math.MaxInt{
memo[amount]=-1
}else{
memo[amount]=res
}
return memo[amount]
}
func min (x,y int) int{
if x>y{
return y
}
return x
}
Last updated