美文网首页
面额拼凑问题

面额拼凑问题

作者: 云淡风轻_935f | 来源:发表于2018-10-22 21:44 被阅读0次

问题描述:给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。 

以前碰到的很多问题我都是直接使用暴力穷举去做,只求能够做出来。这个问题我发现没那么容易,就算是想用暴力但是没有着力点,因为不知道如何确保穷尽

看了别人的解答,发现需要用到动态规划思想。

从特殊到一般。假设你有1020元钱,如何拼凑?

1.1020元用这1、5、10、20、50、100这六种面额拼凑,等价于,1020元用不超过(<=)100元面额的纸币拼凑。

2.1020元用不超过(<=)100元面额的纸币拼凑,等价于,1020元用不超过(<=)50元面额(即不包含100)拼凑的组合数加上用包含100元面额拼凑的组合数。

注:包含100和不包含100合起来就是所有的组合数,保证穷尽。

3.1020用包含100元面额拼凑,等价于,920(抽出一张100,剩下的920)用不大于(<=)100面额拼凑。

结论:1020元用这六种纸币拼凑,等价于,1020元用不超过(<=)50拼凑组合数加上920元用不超过(<=)100拼凑组合数

这样就可以产生一个递推关系(1020,100)=(1020,50)+(920,100)。


递推图

有三个地方要注意。(由特殊到一般)

1.当面额为1时表示已经到了最小面额了,不可再分了,1020(任意一个正整数)用1组合而来只用一种情况,全部都是1块的。

2.当金额为0时,不可再分。那么0用小于20(或者任意其他面额)的面额组合都只用一种情况,一张都没有。

3.当金额小于当前面额时,例如(20,100),20用不大于(<=)100面额拼凑,必然不可能有100、50,所以这一步不应该继续分,而是将(20,100)化为(20,20)一般情况下就是当数目小于当前面额时,先化简,直到数目不小于(>=)面额。

现在这道题思路就清晰了,直接的想法就是利用递归求解。

递归

但是问题出现了,由于递归本身的缺陷,其无法运行金额为10000(超过1000就很吃力了,到5000已经出不了结果了)的情况。

所以需要使用另一种方法,避免递归的缺陷。递归是从后往前推,那么我们可以从前往后推,就是将1到10000所有金额能用这六种面额拼凑的组合分别算出来,并保存。前面的算出来之后就可以用来算后面的。例如(1020,100)=(1020,50)+(920,100),算出了(1020,50)和(920,100)之后自然就可以算出(1020,100)了。看起来要比递归麻烦很多,但是结果却是这种方式更为简单,因为其避免了递归中大量的栈的使用。

下一篇再写。

相关文章

  • 面额拼凑问题

    问题描述:给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N...

  • 拼凑面额:

    题目描述:给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成n元(n...

  • java随笔-责任链

    场景:ATM取钱 100面额 -> 50面额 -> 20面额 -> 10面额 接口类 面额类 ATM类 使用

  • 数字货币的面额问题

    之前我们讲物理形态的货币需要一定的面额设计,来确保整个发币的成本,印刷的成本和使用的便利性达到一个最佳的平衡。但是...

  • 小小商店

    本课旨在让学生运用之前小面额人民币的认识和大面额人民币的认识,解决简单的购物问题。 人民币的认识离...

  • 2019字节跳动笔试

    4道算法题,2个小时。 第1题 有面额1,4,16,64四种面额的硬币,面额1024的纸币,小明拿一张面额1024...

  • 零钱兑换 II

    问题描述 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。...

  • 小言

    人生是银行,努力是小面额钞票,爱情是中面额钞票,梦想是大面额钞票。时间是验钞机。不管是真是假,都应该珍惜。 不管是...

  • 作业帮PHP面试

    一面 优惠券排序:一个优惠券有面额和到期时间两种属性,按照面额从大到小排列,如果面额相同,按照到期时间的从小到大的...

  • 拼凑

    空气的影子 乏善可陈 你的眼睛 黑白分明 它坐下了一个世纪 便无从知道 像一桶破碎的水 现实和虚拟都化为过去 不必...

网友评论

      本文标题:面额拼凑问题

      本文链接:https://www.haomeiwen.com/subject/vsigzftx.html