IT程序员客栈

菜鸟系列 Golang 实战 Leetcode —— 322. 零钱兑换

有兴趣的关注IT程序员客栈哦

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

示例 1:

输入: coins = [1, 2, 5], amount = 11
输出: 3 
解释: 11 = 5 + 5 + 1
示例 2:

输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。

题解 1:

可以采用动态规划,自底向上求值

func coinChange(coins []int, amount int) int {
    // 动态规划算法求解
    var dp =make([]int,amount+1)
    for i:=0;i<amount+1;i++{
        dp[i]=amount+1
    }
    dp[0]=0
    for i:=1;i<=amount;i++{
        for j:=0;j<len(coins);j++{
            if coins[j]==i{
                dp[i]=1
            }else if i>coins[j]{
                if dp[i]>dp[i-coins[j]]+1{
                    dp[i]=dp[i-coins[j]]+1
                }
            }
        }
    }
    if dp[amount]>amount{
        return -1
    }else{
        return dp[amount]
    }
}

题解 2:

考虑通过贪心算法解决,要求钱币数量最少,则优先使用面额较大的钱币。

func coinChange(coins []int, amount int) int {
    // 贪心算法求解
    if amount==0{
        return 0
    }
    var res = amount+1
    sort.Slice(coins,func(i,j int)bool{
        if coins[i]>coins[j]{
            return true
        }
        return false
    })
    help(coins,amount,0,0,&res)
    if res>amount{
        return -1
    }
    return res
}

func help(coins []int, amount int, index int, count int, res *int){
    if amount==0{
        if *res>count{
            *res=count
        }
        return 
    }
    if index==len(coins){
        return
    }
    for k:=amount/coins[index];k>=0&&k+count< *res;k--{
        help(coins, amount-k*coins[index],index+1,count+k,res)
    }
}
posted @   IT程序员客栈  阅读(447)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
IT程序员客栈
点击右上角即可分享
微信分享提示