给你一个整数数组
coins
,表示不同面额的硬币;以及一个整数amount
,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1
。你可以认为每种硬币的数量是无限的。
示例 1:
输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1
思路:
func coinChange(coins []int, amount int) int {
var res = math.MaxInt32
//首先对数据进行逆序排序,先遍历大的数据
sort.Slice(coins, func(i, j int) bool { return coins[i] > coins[j] })
res = coin(coins, amount, 0, 0, res)
if res == math.MaxInt32 {
return -1
}
return res
}
func coin(coins []int, amount, i, count int, ans int) int {
if amount == 0 {
ans = int(math.Min(float64(ans), float64(count)))
return ans
}
if i == len(coins) {
return ans
}
//依次遍历每个数量的 coins[i]
for k := amount / coins[i]; k >= 0 && k+count < ans; k-- {
ans = coin(coins, amount-k*coins[i], i+1, count+k, ans)
}
return ans
}
思路:coins =[1,2,5] 的情况下,dp[11] = min(dp[10],dp[9],dp[6]) + 1
func coinChange(coins []int, amount int) int {
if amount < 1 && len(coins) < 1 {
return -1
}
memo := make([]int, amount+1)
for i := 1; i <= amount; i++ {
memo[i] = math.MaxInt32
for _, c := range coins {
if i >= c && memo[i] > memo[i-c]+1 {
memo[i] = memo[i-c] + 1
}
}
}
if memo[amount] == math.MaxInt32 {
return -1
}
return memo[amount]
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。