python换零钱有多少种方案_Python3算法实例 1.2:动态规划 之 换零钱
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:动态规划 之 换零钱相关推荐
- python换零钱有多少种方案_Python之100个项目:零钱转换程序
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 # Python之100个项目# 假设一个商品的价值为x元,你给了y元, 计算找给你z元的程序(xyz任意的名称而已).需要注意的是,找你的零钱需要转换成 ...
- 动态规划--找零钱有多少种方法
问题: 给定数组arr,arr中的所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法. 分析:arr长度为N,生成 ...
- 用一元五角兑换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++){ ...
- 中文分词算法python代码_python实现中文分词FMM算法实例
本文实例讲述了python实现中文分词FMM算法.分享给大家供大家参考.具体分析如下: FMM算法的最简单思想是使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就ok,如果没有出现,那么找n- ...
- python实现树有多少种方法_教程 | 从头开始:用Python实现决策树算法
如何计算并评价数据集中地候选分割点(Candidate Split Point) 如何在决策树结构中排分配这些分割点 如何在实际问题中应用这些分类和回归算法 一.概要 本节简要介绍了关于分类及回归树( ...
- python 实现数据结构八种内部排序算法
目录 一.插入排序 二.希尔排序 三.冒泡排序 四.快速排序 五.选择排序 六.堆排序 七.归并排序 八.基数排序 一.插入排序 array_test = [8,3,5,1,10,4,2,6,7,9] ...
- 计算100元换算成1元、5元、10元零钱有多少种可能?
#include <stdio.h> int main() { int i,j,k; int total = 0; printf("-----100块钱有 ...
- CSS让一个元素水平垂直居中,到底有多少种方案?
CSS水平垂直居中的方案 水平居中 对于行内元素: text-align: center; 对于确定宽度的块级元素: (1)width和margin实现.margin: 0 auto; (2)绝对定位 ...
- python安装bs4几种方法_python3如何安装bs4
在python官网找到beautifulsoup模块的下载页面,点击"downloap"将该模块的安装包下载到本地. 相关推荐:<Python教程> 将该安装包解压,然 ...
最新文章
- SQL Server 2005 Integration Services (SSIS) (2) - 导入/导出向导
- matlab计算斜方差_计算一幅图像的信噪比
- foxmail邮件怎样打印日历
- 字母三角形c语言ABBBCCCCC,C语言输出ABBBCCCCCDDDDDDDCCCCCBBBA
- VB如何判断文件正被占用/已被打开
- php生成静态页面的方法,php生成静态页面的办法
- matlab入门学习(良心版本,适合小白)
- 使用idea格式化xml中的SQL
- JSP教程 JSP教程 JSP教程 JSP教程 JSP教程 JSP教程
- Codewars-Java编程刷题学习4-Jaden Casing Strings
- Java框架jboot_Jboot v3.0.3 正式版发布,基于 JFinal 的微服务框架
- 阿里云AI训练营SQL入门到实践 Task3:视图、子查询、函数等
- 怎么在中国使用chatgpt
- linux系统安装达梦数据库
- 【SSE-HARD】
- 服务器网卡支持25G,如何使用网卡连接10G/25G/40G服务器与交换机?
- CSS-动效 纯css粒子动效 | 转圈圈 | 上下弹动
- 图像分割——Multi-Scale and Pyramid Network Based Models( PSPN)理解和代码分析
- 计算机已达到最大连接数
- 揭秘香港房地产,未来中国之我见
热门文章
- 搭建hbase1.2.5完全分布式集群
- Aspose.words 书签定位
- [C#项目开源] MongoDB 可视化管理工具 (2011年10月-至今)
- 计算机程序的思维逻辑 (43) - 剖析TreeMap
- I00039 亲密数(Amicable numbers)
- 物流企业信息化 准确定位应该如何做
- 自己动手安装ARM交叉编译工具链
- Python趣味编程小技巧,图片转炫酷字符画,一看就是高手
- 想自学Python却不知该如何入门?这篇文章带你轻松入门Python
- 零基础自学Python:安装Python、解释器、代码风格等