python整钱换零钱_一知半解讲Python第二季:7.钞票兑换
一道让我怀疑人生的题
CCF NOI1034 钞票兑换。
时间限制: 1000 ms 空间限制: 262144 KB
题目描述
将任意给定的整百元钞票,兑换成10元、20元、50元小钞票形式。输出兑换方案总数。
输入
输入需要兑换的钞票总数n。
输出
输出方案总数。
样例输入
100
样例输出
10
数据范围限制
100
看到这题我第一反应就是穷举了,于是稍加思考,一个三层循环的代码就出现了,提交吧。结果如下:
点开数据一看:5410000这个测试超时。
先看看代码吧
#coding:cp936
print('''将任意给定的整百元钞票,
兑换成10元、20元、50元小钞票形式。输出兑换方案总数。''')
n=int(input("请输入100的整数倍的钱数:"))
sum=0
for i in range(0,n//10+1,1):
for j in range(0,n//20+1,1):
for k in range(0,n//50+1,1):
if i*10+j*20+50*k==n:
sum=sum+1
print("共有",sum,"种方案。")
input()
(ps:oj.noi.cn不支持Python,这是我转写的,注意 n//10这里必须用//,表示整除,/计算结果为float类型,而循环终止值要求必须整型)
好吧,知道了超时,就想到了循环次数可能多了,那就减吧。
别告诉我你写的话n//10、n//20、n//50都写成n了。那就和我一样了。上面的代码思路是我第一次减次数时想到的。但不行开始写这篇文章时我测试的这个数据,现在都跑了10多分钟了还没出结果。想象一下它会执行多少次循环吧。5410000/10*5410000/20*5410000/50=15834042100000000
1万5834万零421亿次
吓人不,按这需求我这台2.93Ghz计算机大约要计算多久?
ps:参考网上算法2.93Ghz大致就是相当于每秒计算29.3亿次,不知是否准确,仅供参考。
算到这把我都吓到了,赶紧结束那个还在跑的程序。
后来,想到了,10元和20元知道了,50元的自然就知道了,并且,10元的数量确定了20的最大数量也就确定了,所以做了如下修改,少了一重循环,并且二重循环的循环次数也减少了。
for i in range(0,n//10+1,1):
for j in range(0,(n-10*i)//20+1,1):
if (n-i*10-j*20)%50==0:
sum=sum+1
但是,还不行,再想。根据上面的思路,其实是知道了三种面额的两个就能知道第三个的数量。那么如果从10元开始循环,循环的次数一定高于从50元的,并且是它的5倍。所以改为如下代码:
for i in range(0,n//50+1,1):
for j in range(0,(n-50*i)//20+1,1):
if (n-i*50-j*20)%10==0:
sum=sum+1
结果你也预见到了,肯定还是不行。到这里我就没辙了,思考了好久也不得其法隐隐感觉,其实这里的if是不必要的,因为余下的钱可能能被10整除,可是再怎么也想不明白了。
无奈,求助度娘吧。找了一圈,方法是找到了,可以我的智商,还是理解不够透彻,如果想给别人讲是讲不明白的,只能说是知道了这样可以,也大致明白为什么。先上代码吧:
for i in range(0,n//50+1,1):
sum=sum+(n-50*i)//20+1
用上面的数据测试,瞬间完事儿:
请输入100的整数倍的钱数:5410000
看看这种方法的作者的解释:
假定50元的钞票有i张,那么这种情况下的方案数就能算出来了。
例如 n=100
50元 有3种情况
(1)0张,则把剩余的钱(100元)换算成20元,可以有5张(即20,20,20,20,20,此为1种方案),每个20元都可以用2张10元来代替,这样5张20元,就可以有5次兑换成10元的机会,即由此产生5种兑换方案。这样,50元为0张时,兑换的方案数就是5+1;
(2)1张,则把剩余的钱(50元)换算成20元,可以有2张(即50,20,20,10,此为1种方案),每个20元都可以用2张10元来代替,这样2张20元,就可以有2次兑换成10元的机会,即由此产生5种兑换方案。这样,50元为0张时,兑换的方案数就是2+1;
(3)2张,则把剩余的钱(0元)换算成20元,可以有0张(即50,50,此为1种方案)
---------------------
来源:CSDN
版权声明:本文为博主原创文章,转载请附上博文链接!
你能看懂吗?反正我是似懂非懂,即便懂了也是那种知道但想不到的的懂。
大致说一下我的似懂非懂:
基本思路:
1、关注两个钱数:50和20,10自然就确定了。因为50是大数循环次数少,所以选50做循环基数。
2、穷举50的个数,这时50的个数的已知的,那么20和10的个数便由剩余的钱数n-50*i决定。而20的个数(n-50*i)//20*(0—n//20),当20的个数确定了,10的个数就确定了。这样就形成了一种方案。
3、在50和20都确定了一个具体的数时,即上面形成的方案情况下,即50和10的个数都确定的情况下,又可以将20的个数(n-50*i)//20又可以成2*(n-50*i)//20个10元,而这又有20的个数种方案,即(n-50*i)//20种。
4、所以一个50的个数对应的方案是(n-50*i)//20+1种,依次穷举累加即可。
解释就到这里,聪明的你一定比我想的明白,我是只能感叹自己的智商不够啦!
如果这个你能轻松的理解,那么再看看下面这个更变态的解法吧:
n=n//100
sum=5*n*n+4*n+1
没错,一个循环都没有,直接上求和公式。看看大佬的思路:
刚才本质上已经相当于数列求和,把a=0单独提出
sum=∑a=02i(INT(5i−2.5a)+1)=5i+1+∑a=12i(INT(5i−2.5a)+1)
sum=∑a=02i(INT(5i−2.5a)+1)=5i+1+∑a=12i(INT(5i−2.5a)+1)
展开,分奇偶讨论,去掉取整
=5i+1+∑a=0i(INT(5i−2.5(2a−1))+INT(5i−2.5(2a))+2)
=5i+1+∑a=0i(INT(5i−2.5(2a−1))+INT(5i−2.5(2a))+2)
=5i+1+∑a=0i(10i−10a+4)
=5i+1+∑a=0i(10i−10a+4)
sum=5i2+4i+1
sum=5i2+4i+1
简化成这样,配的上超进化这个名字
---------------------
作者:作业乃身外之物
来源:CSDN
版权声明:本文为博主原创文章,转载请附上博文链接!
我表示只能膜拜啦!
智商高、数学好真牛!
怎么样,你有没有像我一样怀疑人生?
不过,怀疑归怀疑,学习还是得继续!
python整钱换零钱_一知半解讲Python第二季:7.钞票兑换相关推荐
- 整钱换零钱问题。把1元换成1分、2分、5分的硬币,共有多少种不同的换法(C语言)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: [实验体验] 1.整钱换零钱问题.把1元换成1分.2分.5分的硬币,共有多少种不同的换法. 提示:设5分币个数为i(0-20) ...
- Python零基础速成班-第9讲-Python面向对象编程(上),对象和类、初始化、继承、重写、多态、类方法、组合
Python零基础速成班-第9讲-Python面向对象编程(上),对象和类.初始化.继承.重写.多态.类方法.组合 学习目标 修饰器 面向对象编程:对象和类.初始化.继承.重写.多态.类方法.组合 课 ...
- Python零基础速成班-第6讲-Python异常处理Exception,tryexcept,raise,assert,输入模块pyinputplus
Python零基础速成班-第6讲-Python异常处理Exception,try&except,raise,assert,输入模块pyinputplus 学习目标 异常处理Exception: ...
- Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云)
Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云) 学习目标 获取网络数据Socket API接口 网络爬虫Crawler(制 ...
- 人民币兑换c语言程序,C语言换零钱:把一元人民币兑换成硬币,共有多少种兑换方法?...
C语言换零钱:把一元人民币兑换成硬币,共有多少种兑换方法? 答案:6 信息版本:手机版 解决时间 2019-10-07 06:29 已解决 2019-10-06 08:05 以下是我敲的代码,经Mi ...
- Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门
Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门 学习目标 Python处理Excel(使用openpyxl包).图表入门\ P ...
- Python零基础速成班-第2讲-Python基础(上),运算、变量、数据类型、输入输出
Python零基础速成班-第2讲-Python基础(上),运算.变量.数据类型.输入输出 学习目标 使用print输出结果 运算及运算符 变量 数据类型(4种最常用的) 输入输出 课后作业(4必做+1 ...
- Python零基础速成班-第13讲-Python正则表达式Regex
Python零基础速成班-第13讲-Python正则表达式Regex 学习目标 正则表达式 课后作业(4必做) 友情提示:将下文中代码拷贝到JupyterNotebook中直接执行即可,部分代码需要连 ...
- Python零基础速成班-第10讲-Python面向对象编程(下),Property属性、特殊方法、设计模式、链表应用
Python零基础速成班-第10讲-Python面向对象编程(下),Property属性.特殊方法.设计模式.链表应用 学习目标 面向对象编程 接上一讲:Property属性.特殊方法.设计模式 面向 ...
最新文章
- 实用技巧:使用 jQuery 异步加载 JavaScript 脚本
- C语言学习之求两个整数的最大值
- Hbase总结(十)Hhase性能调优
- 46. 全排列015(回溯法求解)
- LintCode Python 简单级题目 41.最大子数组 - 44.最小子数组和
- windows 微信手机端退出登录,pc电脑端不退出的奇淫技巧
- 计算机论文外文翻译,计算机毕业论文外文文献译文.doc
- 老猿学5G随笔:RAN、RAT以及anchor移动性锚点的概念
- mysql 1114_mysql 解决 ERROR 1114 (HY000): The table 'XXX' is full
- 罗马盘、大力盘、大圣盘等搜索网站,简单绕过付费
- 2019 年第 31 周 DApp 影响力排行榜 | TokenInsight
- 网上商城所需软硬件架构分析
- 副总和副总裁的区别_总经理与副总经理的巨大区别
- 微信小程序获取页面高度
- 百度地图 JS API Marker自定义图标
- X1 Carbon wifi 8260 无线网卡驱动安装 backports
- android 对话框 美化,Android修改Dialog样式
- java克隆实现_JAVA里的深克隆与浅克隆实现
- EDKII实现bmp图片加载并显示的应用程序
- 四大美女 沉鱼-->西施 落雁-->王昭君 闭月-->貂禅 羞花-->杨玉环
热门文章
- iPhone12屏幕问题超多 iPhone12 Pro Max却大获好评
- 部分html标签学习分享——制作歌曲推荐网页
- 妻子同网友私奔后,北京某老公在BBS上的留言!绝对强
- 图片和Word查阅有什么区别?图片文字怎么转换成word文档
- jmeter 建立一个JMS主题测试计划
- python画图将标题中有变量_如何在matplotlib中打印变量名作为标题
- 没考计算机二级直接能考三级?计算机三级考试考啥
- C51 函数cos()与acos()使用注意点
- 在powerpoint中默认的视图是_在PowerPoint2010中默认的视图模式是A.普通视图B.阅读视图C.幻灯片浏览视图D.备注视图...
- 【项目完结】笑靥如春三冬暖,嫣语似晴沉霾散。西子湖畔梦犹然,情起缘尽余心安。