还零钱

news/2025/3/15 1:13:58/

题目描述

考虑仅用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] = 1for i in xrange(n+1):dp[0][i] = 1for 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] * 10001
dp[0] = 1
def getCount(n):for i in xrange(5):j = money[i]while j < n:dp[j] += dp[j-money[i]]j = j + 1
getCount(10001)
while True:try:n = int(raw_input())print dp[n]except:break

 

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


http://www.ppmy.cn/news/510513.html

相关文章

凑零钱

韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里&#xff0c;发现这家店有个特别的规矩&#xff1a;你可以用任何星球的硬币付钱&#xff0c;但是绝不找零&#xff0c;当然也不能欠债。韩梅梅手边有 104枚来自各个星球的硬币&#xff0c;需要请你帮她盘算一下&#xff0c;…

XJOI1131换零钱

题目描述 一张n元人民币换成1元、2元、5元的零钱&#xff0c;编程计算共有多少种方法&#xff1f; 输入格式&#xff1a; 输入一行&#xff0c;包含一个整数 输出格式&#xff1a; 输出一行&#xff0c;包含一个整数 样例输入&#xff1a; 100 样例输出&#xff1a; 541 …

微信账单分析

科二挂了&#xff0c;六级过了&#xff0c;真是大喜大悲的一天啊&#xff0c;下午躺了一下午。 这次写的是用python来做微信账单分析&#xff0c;以我七月份的消费为例&#xff0c;进行分析。 最终达到的效果如下&#xff0c;为了避免泄露博主隐私&#xff0c;消费记录进行了打…

轻松记账 教你修改收支记录的步骤

如何记账&#xff0c;比较记账后如何修改或者删除不需要的收支明细呢&#xff1f;今天小编就给大家分享一个记账技巧 &#xff0c;下面小编演示操作步骤&#xff0c;希望能给大家带来帮助&#xff0c;一起来看看吧&#xff01; 第一步&#xff0c;运行【晨曦记账本】在软件主界…

零钱问题

有1块&#xff0c;2块&#xff0c;5块&#xff0c;10块&#xff0c;20块&#xff0c;50块&#xff0c;100块&#xff0c;200块这几种面值的货币&#xff0c;问总共有多少种组合出200块的方法&#xff1f; 循环穷举是通常首先想到的办法 int count0; int a, b, c, d, e, f, g;…

找零钱的两种方法

有时候&#xff0c;去便利店买几块钱的东西&#xff0c;但没有零钱&#xff0c;只能给他们一张100的&#xff0c;他们可能找给我一沓10块的和几枚硬币。我不喜欢这么多的零钱&#xff0c;要知道&#xff0c;钱越零散&#xff0c;散失地就越快&#xff0c;我希望找给我的零钱张数…

零钱有限制和没有限制的找零钱问题

在参加腾讯模拟考的时候&#xff0c;其中的一道编程题是找零钱的问题&#xff0c;但是零钱的数量是一定的&#xff0c;并不是无限的。而且零钱都是2的K次幂&#xff0c;1&#xff0c;2&#xff0c;4&#xff0c;8&#xff0c;16&#xff0c;….每种零钱的数量是 2&#xff0c;给…

MySQL之误删数据如何处理

写在前面 在工作中不管是程序bug&#xff0c;运维的失误&#xff0c;等&#xff0c;都有可能导致数据误删除&#xff0c;或者是误操作&#xff0c;此时我们就必须快速的恢复数据&#xff0c;避免对正常业务造成过大的影响&#xff0c;甚至出现事故&#xff0c;本文我们按照如下…