<每日一题>动态规划入门:求最小硬币个数
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代码:
当d[s]返回inf时,说明c中的元素无法组通过想加到达s
给出已有的硬币面额,和需用这些硬币组成的目标金钱数目,求能够组成这个目标金钱的最少硬币个数。
问题分析:
给定面额为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
相关文章推荐
- 动态规划入门<三>
- <蓝桥杯>动态规划解最长公共子序列
- Mybatis最入门---动态查询( <trim prefix="where" prefixOverrides="and|or"> )
- 动态规划入门之硬币问题
- poj 1973 分配任务 进阶动态规划 <难题>
- 动态规划思想之最小硬币分配数
- 硬币问题(字典最小序)-DAG动态规划问题
- 动态规划实例(九):最小硬币找零数
- 动态规划之 <筷子>
- java—将查询的结果封装成List<Map>与用回调函数实现数据的动态封装(44)
- Mybatis简单入门<学习随笔>
- Python入门<三>
- C++入门笔记<实现复数类>
- 数据结构实例<三>(匹配链表所有元素删除后并返回新的链表)入门
- <<AI入门(4)>>(C)
- java 从零开始,学习笔记之基础入门<线程及实例分析>(十九)
- 01背包问题(动态规划入门)
- 积分从入门到放弃<2>
- 字符串动态添加"<br>"
- 动态规划入门题