您的位置:首页 > 其它

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

2017-11-27 17:47 190 查看
问题描述:

给出已有的硬币面额,和需用这些硬币组成的目标金钱数目,求能够组成这个目标金钱的最少硬币个数。

问题分析:

给定面额为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的最少硬币个数,那么

d
=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)]
#依次求出d[1],d[2],...,d[s]
for i in range(1,s+1):
#当c中元素均大于i时,说明i无法由c中任何元素构成,设置为inf
d[i]=min([d[i-cc]+1 if cc<=i else float('inf') for cc in c])
return d[s]


当d[s]返回inf时,说明c中的元素无法组通过想加到达s
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划