每日一题 322. 零钱兑换 Golang 动态规划

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

示例 1:

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

示例 2:

输入: coins = [2], amount = 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]
}
发布了38 篇原创文章 · 获赞 0 · 访问量 1035

猜你喜欢

转载自blog.csdn.net/Cyan1956/article/details/104728056