money.jpg

问题(基础版):

把100元兑换成1元,2元,5元,10元,20元,50元的零钱,共有多少种不同换法。

动态规划思想解析:

拆解子问题

下面以5元换成1,2,3元的零钱为例。T[(change),target]表示用零钱序列change组成target的所有方法。见下图:

example.png

其中:

T1[(1,2),5-0*3]可看作只用1和2元、不用3元组成5元的方法数;

T2[(1,2),5-1*3]可看作用1和2元、并且只用1个3元组成5元的方法数;

T6[(1),3]可看作用1元,只用1个2元、并且不用3元组成5元的方法数;

T9[(1),0]可看作用1元,只用1个2元、只用1个3元组成5元的方法数。

状态转移表达式:

problem.png

边界条件:

M-nd不得小于0,并且当M-nd等于0时,也就是说之前的选择已经组成了目标,所以表达式结果为1。

如果表达式为T[(a),c],只有a可以被c整除,此表达式才为1,否则为0。例如T[(2),5]=0,T[(2),6]=1。Python3程序实现

#递归实现

#根据边界条件编写程序

def Solve(exlist,target):

#判断问题解

if target==0:

return 1

else:

if len(exlist)==1 and target%exlist[0]==0:

return 1

else:

return 0

#递归的方式,先将问题拆解为子问题的集合

def Dismantle(exlist):

if len(exlist[0][0])>1:

fu=[]

for ie in exlist:

for ji in range(int(ie[1]/ie[0][-1])+1):

fu.append([ie[0][0:-1],ie[1]-ji*ie[0][-1]])

return Dismantle(fu)

else:

return exlist

#计算结果

def Recursion(exlist,target):

structer=[[exlist,target]]

count=0

for jj in Dismantle(structer):#所有子问题的集合

if Solve(jj[0],jj[1])==1:#计算每一个子问题的结果

count+=Solve(jj[0],jj[1])

return count

print(Recursion([1,2,5,10,20,50],100))

结果:4562

上述的递归程序编写较为复杂,但是容易理解,下面给出基于动态规划的程序。

#动态规划实现

def DP_Com(exlist,num):

an=[1]+[0]*num

for i in exlist :

for j in range(i,num+1):

an[j]+=an[j-i]

return an[num]

print(DP_Com([1,2,5,10,20,50],100))

结果:4562

问题(进阶版):

有面值为1元、3元和5元的钱币若干张,如何用最少的钱币凑够11元,并列出组合方法。

拆解子问题:

和基础版问题相比,此题复杂之处在于最小值的计算。详细见下图:

min.png

Python3程序实现

#记录

def DP_Min(exlist,target):

fan=[0]+[target]*target

record=['']*(target+1)

#存储最后一位

lic=[]

for i in exlist:

for j in range(i,target+1):

if fan[j-i]!=target:#如果等于target,说明之前没有数的结合可以达到这个数

fan[j]=min(fan[j-i]+1,fan[j])

#记录

if fan[j-i]+1<=fan[j]:

record[j]=record[j-i]+'%d*'%i

else:

record[j]=record[j]

if record[-1]!='':

lic.append(record[-1])

if len(lic)==0:

return '无解'

else:

return lic,fan[target]

#处理字符串

def Handle(exstr,num):

for i in set(exstr):

hu=i.split('*')

hu=list(filter(lambda x:x,hu))#去除掉split留下的空格

if len(hu)==num:

shuoming=''

for j in set(hu):

shuoming+='%s个%s '%(hu.count(j),j)

print(shuoming)

return 'Done'

ggg=DP_Min([1,3,5],11)

print(Handle(ggg[0],ggg[1]))

#结果:最少为3。组合方法:2个5 1个1

不定期更新,欢迎留言,敬请关注!!!

python换零钱有多少种方案_Python3算法实例 1.2:动态规划 之 换零钱相关推荐

  1. python换零钱有多少种方案_Python之100个项目:零钱转换程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 # Python之100个项目# 假设一个商品的价值为x元,你给了y元, 计算找给你z元的程序(xyz任意的名称而已).需要注意的是,找你的零钱需要转换成 ...

  2. 动态规划--找零钱有多少种方法

    问题: 给定数组arr,arr中的所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法. 分析:arr长度为N,生成 ...

  3. 用一元五角兑换5分、2分、1分的硬币(每种都要有)共100枚,共一共有多少种方案?

    #include<stdio.h> int main() {int i,j,k;int count=0;for(i=1;i<30;i++){for(j=1;j<75;j++){ ...

  4. 中文分词算法python代码_python实现中文分词FMM算法实例

    本文实例讲述了python实现中文分词FMM算法.分享给大家供大家参考.具体分析如下: FMM算法的最简单思想是使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就ok,如果没有出现,那么找n- ...

  5. python实现树有多少种方法_教程 | 从头开始:用Python实现决策树算法

    如何计算并评价数据集中地候选分割点(Candidate Split Point) 如何在决策树结构中排分配这些分割点 如何在实际问题中应用这些分类和回归算法 一.概要 本节简要介绍了关于分类及回归树( ...

  6. python 实现数据结构八种内部排序算法

    目录 一.插入排序 二.希尔排序 三.冒泡排序 四.快速排序 五.选择排序 六.堆排序 七.归并排序 八.基数排序 一.插入排序 array_test = [8,3,5,1,10,4,2,6,7,9] ...

  7. 计算100元换算成1元、5元、10元零钱有多少种可能?

    #include <stdio.h> int main() {     int i,j,k;     int total = 0;     printf("-----100块钱有 ...

  8. CSS让一个元素水平垂直居中,到底有多少种方案?

    CSS水平垂直居中的方案 水平居中 对于行内元素: text-align: center; 对于确定宽度的块级元素: (1)width和margin实现.margin: 0 auto; (2)绝对定位 ...

  9. python安装bs4几种方法_python3如何安装bs4

    在python官网找到beautifulsoup模块的下载页面,点击"downloap"将该模块的安装包下载到本地. 相关推荐:<Python教程> 将该安装包解压,然 ...

最新文章

  1. SQL Server 2005 Integration Services (SSIS) (2) - 导入/导出向导
  2. matlab计算斜方差_计算一幅图像的信噪比
  3. foxmail邮件怎样打印日历
  4. 字母三角形c语言ABBBCCCCC,C语言输出ABBBCCCCCDDDDDDDCCCCCBBBA
  5. VB如何判断文件正被占用/已被打开
  6. php生成静态页面的方法,php生成静态页面的办法
  7. matlab入门学习(良心版本,适合小白)
  8. 使用idea格式化xml中的SQL
  9. JSP教程 JSP教程 JSP教程 JSP教程 JSP教程 JSP教程
  10. Codewars-Java编程刷题学习4-Jaden Casing Strings
  11. Java框架jboot_Jboot v3.0.3 正式版发布,基于 JFinal 的微服务框架
  12. 阿里云AI训练营SQL入门到实践 Task3:视图、子查询、函数等
  13. 怎么在中国使用chatgpt
  14. linux系统安装达梦数据库
  15. 【SSE-HARD】
  16. 服务器网卡支持25G,如何使用网卡连接10G/25G/40G服务器与交换机?
  17. CSS-动效 纯css粒子动效 | 转圈圈 | 上下弹动
  18. 图像分割——Multi-Scale and Pyramid Network Based Models( PSPN)理解和代码分析
  19. 计算机已达到最大连接数
  20. 揭秘香港房地产,未来中国之我见

热门文章

  1. 搭建hbase1.2.5完全分布式集群
  2. Aspose.words 书签定位
  3. [C#项目开源] MongoDB 可视化管理工具 (2011年10月-至今)
  4. 计算机程序的思维逻辑 (43) - 剖析TreeMap
  5. I00039 亲密数(Amicable numbers)
  6. 物流企业信息化 准确定位应该如何做
  7. 自己动手安装ARM交叉编译工具链
  8. Python趣味编程小技巧,图片转炫酷字符画,一看就是高手
  9. 想自学Python却不知该如何入门?这篇文章带你轻松入门Python
  10. 零基础自学Python:安装Python、解释器、代码风格等