博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
还零钱
阅读量:5067 次
发布时间:2019-06-12

本文共 1860 字,大约阅读时间需要 6 分钟。

题目描述

考虑仅用1分、5分、10分、25分和50分这5种硬币支付某一个给定的金额。例如需要支付11分钱,有一个1分和一个10分、一个1分和两个5分、六个1分和一个5分、十一个1分这4种方式。
请写一个程序,计算一个给定的金额有几种支付方式。
注:假定支付0元有1种方式。

输入描述:

输入包含多组数据。 每组数据包含一个正整数n(1≤n≤10000),即需要支付的金额。

输出描述:

对应每一组数据,输出一个正整数,表示替换方式的种数。
示例1

输入

11 26

输出

4 13 思路:使用动态规划来做,dp[i][j]表示前i种零钱换总金额为j的方法种数: 如果第i种货币参与换算,那么第i中货币可能有0个,1个,2个,3个...k个,dp[i][j] = dp[i-1][j] + dp[i-1][j-1*money[i]] + dp[i-1][j-2*money[i]] +...+ dp[i-1][j-k*money[i]],其中k*money[i] <= j   递归递推公式:     dp[i][j] = dp[i-1][j] + dp[i-1][j-1*money[i]] + dp[i-1][j-2*money[i]] +...+ dp[i-1][j-k*money[i]],其中k*money[i] <= j   那么,将j = j - money[i]进行替换,则     dp[i][j-money[i]] = dp[i-1][j-1*money[i]] + dp[i-1][j-2*money[i]] +...+ dp[i-1][j-k*money[i]],其中k*money[i] <= j   将上面两个等式进行合并,那么:     dp[i][j] = dp[i-1][j] + dp[i][j-money[i]]
如果第i种货币不参与换算,那么:   dp[i][j] = dp[i-1][j] 最后代码实现如下:
money=[1,5,10,25,50]dp = []def getCount(n):    for i in xrange(5):        dp.append((n+1)*[0])        dp[i][0] = 1    for i in xrange(n+1):        dp[0][i] = 1    for i in xrange(1,5):        for j in xrange(1,n+1):            if j < money[i]:                dp[i][j] = dp[i-1][j]            else:                dp[i][j] = dp[i-1][j] + dp[i][j-money[i]]getCount(10000)while True:    n = int(raw_input())    if n:        print dp[4][n]    else:        break

优化:二维数组每次都是只用到了2个数,那么应该可以用一维数组进行优化,它的表示是:dp[i]:总金额为i的换零钱的方法数目。

dp[0] = 1,由题目意思可得

dp[i] = dp[i-money[0]] + dp[i-money[1]] + dp[i-money[2]] + dp[i-money[3]] + dp[i-money[4]],其中i >= money[j],j=0..4

意思是,第i种状态,由前面几种状态转化而来的,类似于跳台阶。

代码如下:

money=[1,5,10,25,50]dp = [0] * 10001dp[0] = 1def getCount(n):    for i in xrange(5):        j = money[i]        while j < n:            dp[j] += dp[j-money[i]]            j = j + 1getCount(10001)while True:    try:        n = int(raw_input())        print dp[n]    except:        break

 

转载于:https://www.cnblogs.com/Spider-spiders/p/10626812.html

你可能感兴趣的文章
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
iOS开发——缩放图片
查看>>
HTTP之URL的快捷方式
查看>>
满世界都是图论
查看>>
配置链路聚合中极小错误——失之毫厘谬以千里
查看>>
蓝桥杯-分小组-java
查看>>
Android Toast
查看>>
iOS开发UI篇—Quartz2D使用(绘制基本图形)
查看>>
docker固定IP地址重启不变
查看>>
桌面图标修复||桌面图标不正常
查看>>
JavaScript基础(四)关于对象及JSON
查看>>
JAVA面试常见问题之Redis篇
查看>>
jdk1.8 api 下载
查看>>