LeetCode322.零钱兑换
记忆化搜索
func coinChange(coins []int, amount int) int {
var f = make([]int, amount)
var searchChange func(coins []int, amount int) int
searchChange = func(coins []int, amount int) int {
if amount == 0 {
return 0
} else if amount < 0 {
return -1
}
if f[amount-1] != 0 {
return f[amount-1]
}
min := math.MaxInt
for _, coin := range coins {
res := searchChange(coins, amount-coin)
if res >= 0 && res < min - 1 {
min = res + 1
}
}
if min == math.MaxInt {
f[amount-1] = -1
} else {
f[amount-1] = min
}
return f[amount-1]
}
return searchChange(coins, amount)
}
动态规划
func coinChange(coins []int, amount int) int {
if amount == 0 {
return 0
}
var dp = make([]int, amount+1)
for i := 1; i <= amount; i++ {
dp[i] = -1
}
for i := 1; i <= amount; i++ {
for _, coin := range coins {
pre := i - coin
if pre >= 0 && dp[pre] != -1 {
if dp[i] == -1 || dp[i] > dp[pre] + 1 {
dp[i] = dp[pre] + 1
}
}
}
}
return dp[amount]
}