<每日一题>动态规划入门:求最小硬币个数

博客介绍了使用动态规划解决求解组成目标金钱的最少硬币个数问题。通过分析问题,定义状态转移方程d[n],并提供Python代码实现。当无法用给定硬币面额组成目标金钱时,返回无穷大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
给出已有的硬币面额,和需用这些硬币组成的目标金钱数目,求能够组成这个目标金钱的最少硬币个数。
问题分析:
给定面额为c=[c1,c2,…ck],给定金钱数目为s,s可以由c中任意可行面额组成,则k可以分成:
s - ci + ci ,其中i<=k,且ci<=s,这样问题就转化为组成 金额为s-ci的最少硬币个数,假设为m,则组成s的最少硬币个数为m+1,同理可以继续求解s-ci。于是,我们可以定义d[n]表示组成n的最少硬币个数,那么
d[n]=min([ d[s-ci]+1,其中i<=k,且ci<=s ] ),我们可以由1到n依次记录d[x],即自底向上,当我们再次用到d[x]就不必再次计算。
python代码:

def leastCoins(c,s):
    #初始化d数组,d[0]=0,其余为inf(无限大),共有s+1个元素
    d=[float('inf') if i != 0 else 0 for i in range(s+1)]
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值