从找零到人民币面额设计

引子

晚上坐飞机从北京回成都,在机场候机花了23元买了一袋麻辣牛肉干。身上没零钱,就拿了一张100给售货员找零77。突然觉得这件事情太好玩儿了。中国发行的货币有100、50、20、10、5、1这几种面额的纸币。为什么我们的面额要这样设计呢?不这样设计会怎样?假设这几种面额的设计是合理的,那么这些纸币要按照什么样的比例进行发行才能保证我们生活中给100找73的这个看似很简单的事情能够正常进行呢?地球太神奇了。

面额为什么这样设计?

面额的设计会影响我们什么?面额设计的目的目标又是什么?如果我任意设计面额1,4,5,8,9这样。看似不合理,但是它会有什么不好的地方吗?我们不想清楚这个问题,我们就不知道怎么样的面额设计才是合理的,更不知道设计面额的时候需要考虑的是什么。

如果我们只发行100元的纸币。这意味着货币面额的本身就不能支持价值100元一下的商品的交易,这说明面额设计需要考虑【可用性】。

如果仅仅考虑可用性,我们可以只发行1元的纸币。理论上,我们可以用N个1元购买任意金额的商品。但是,如果想要买99元的东西,就开始悲剧了。这说明面额设计需要考虑【便捷性】。

如果我们认为便捷性唯一的考量因素是我们支付时需要支付的纸币的张数。那么,为什么我们不每个面额的纸币都发行一张呢?比如,我们有1、2、3、4、5、6、7、8、9、10、11、12、13、14...97、98、99元,这样任意100以内的金额,我们只需要一张纸币就足够了。我在机场只需要给售货员一张23的纸币就ok了。

问题在于,我怎么知道我到了机场我就想买那袋23元的麻辣牛肉干。而不是旁边的30的五香牛肉干?如果我提前不知道,或者很难预测,那我为了达到只需要支付一张纸币的”便捷性“,我就要准备1~99面额的纸币各一张,就身上随时要携带4950元,一共99张纸币,我们还能说这是便捷的吗?

所以,我们在设计纸币面额的时候不仅仅需要考虑到可用性和最直观的便捷性这些发生在交易一瞬间的特性,也要考虑到”现金交易的时间、金额的【不确定性】。正是因为这个不确定性,又会反过来影响我们的【便捷性】,所以,我们设计编辑的面额,不仅仅是支付一个特定金额的便捷,而是支付任意金额的便捷。

再想,如果用1,4,5,8,9这样的方式进行设计,会有什么问题吗?假设我们1~9出现的概率相同,那么可以得到这样一个最“便捷”的表

1: 1张1元

2: 2张1元

3: 3张1元

4: 1张4元

5: 1张5元

6: 1张5元 + 1张1元

7: 1张5元 + 2张1元

8: 1张8元

9: 1张9元

统计:1元纸币出现的概率为:5/9,5元纸币出现的概率为:3/9,4\8\9出现的概率都是:1/9,这说明,我们这样的设计本身就不是对称的。4\8\9这样的面额设计出来被人使用的概率就很小,我们就不要提供这样的面额。【使用率】。

如果按照1,2,5这样的方式进行设计:

1: 1张1元

2: 1张2元

3: 1张1元 + 1张2元

4: 2张2元

5: 1张5元

6: 1张5元 + 1张1元

7: 1张5元 + 2张1元

8: 1张5元 + 1张2元 + 1张1元

9: 1张5元 + 2张2元

统计:1张纸币出现的概率为:5/9,2元纸币出现的概率为:6/9,5元纸币出现的概率为:5/9。几乎一摸一样。

我们在上面的讨论中没有涉及到找零。原因很简单,比如,我买了23元的牛肉干,我给的是100。其实问题就变成了售货员如何给我77。所以问题是不变的,都是如何用最少的纸币构造出特定的金额,问题的核心并不是由谁来构造,如果我刚好身上有一堆零钱,就该我掰手指点钱了。于是,我们设计的重点就可以简化成,如何【便捷】的构造金额。

上面的例子纯属虚构,我们人民币并没有2元的面额。那问题就来了,我们的人民币的面额设计为什么这么没有对称的美感呢?为什么我们有20元的面额,却没有2元的面额?是很随意的决定?【50、20、10】,【5,2,1】不更加有美感吗?如果我们没有2元的面额,这意味着什么?1元面额的增多?是不是因为我们有1元的硬币呢?那为什么又要有硬币呢?有了纸币,硬币存在的必要性又是什么?

按照什么比例发行纸币?

如果按照现在人民币的面额1,5,10,20,50来进行设计,我们需要各种纸币需要按照什么样的比例来发行呢?

在回答了面额要如何设计以后,这个问题现在变得容易了,我们假设1~99出现的概率一致。那我们只要把每个金额的最简方式列出来,再统计比例就行了。不想算了(算是计算的算)。

时间: 2024-11-10 13:08:11

从找零到人民币面额设计的相关文章

找零问题

问题描述: 为找零问题 设计一种动态规划算法:给定金额n以及各种面额d1,d2,...,dm的数量无限的硬币,求总金额等于n的硬币的最少个数,或者指出该问题无解. (对于该问题可以用动态规划方法或者贪婪法求解,但贪婪法要注意如何说明局部最优可以保证全局最优) 思路:  各种硬币的面额为 d[1,2,3,..N],设C[i,j]为在前i种面额中求总面值为j的最优解(最少硬币数). 初始化 C[i,j] = 正无穷 (i=0, j>=1 && j<=N) c[i,j] = 0(i&

18-硬币找零

/*                                     硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述    在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资.    我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,    0.02,0.01 元,采用这些硬币我们可以对任

NYOJ995硬币找零(简单dp)

1 /* 2 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 3 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 4 5 思路:转换成完全背包的问题! 6 */ 7 #include<iostream> 8 #include<cstring> 9 #include<cstdio> 10 #include<algorithm> 11 #define INF 0x3f3f3f3

硬币找零问题

硬币找零问题一个经典问题,也是阐述动态规划法几乎必讲的一个例子. 硬币找零问题描述:现存在一堆面值为 V1.V2.V3 - 个单位的硬币, 各单位的硬币数目不限, 问最少需要多少个硬币才能找出总值为 T 个单位的零钱? 比如: 假设这一堆面值分别为 1.2.5.21.25 元,需要找出总值 T 为 63 元的零钱. 基于动态规划的思想,我们可以从目标值为 1 元开始计算出最少需要几个硬币,然后再求 2 元.3元- 每一次求得的结果都保存在一个数组中,以后需要用到时则直接取出即可. #includ

硬币找零问题之动态规划

今天我们看一下动态规划的硬币找零问题,主要通过一系列编程题分析动态规划的规律,只要掌握这一规律,许多动态规划的相关问题都可以类比得到. 题目1:给定数组arr,arr中所有的值都是正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 举例: arr[5,2,3],aim=20.  4张5元可以组成20元,其他的找钱方案都要使用更多张的货币,所以返回4. 题解: 一眼看去这道题好像可以用贪心算法可解,但是仔细分析发现有

nyoj995硬币找零(dp完全背包)

硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此

NYOJ 995 硬币找零

硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此

算法笔记_048:找零问题(Java)

目录 1 问题描述 2 解决方案 2.1 动态规划法   1 问题描述 现需找零金额为n,则最少需要用多少面值为d1 < d2 < d3 < ... < dm的硬币?(PS:假设这m种面值d1 < d2 < d3 < ... < dm的硬币,其中d1 = 1,且每种硬币数量无限可得) 2 解决方案 2.1 动态规划法 本文编码思想参考自<算法设计与分析基础>第三版,具体讲解如下: 具体代码如下: package com.liuzhen.chapt

货币找零问题

已知,中华人民共和国的纸币面额分别为:100元.50元.20元.10元.5元.2元.1元,输入钱数,输出最小的货币方案. int main() { int value[7] = { 100, 50, 20, 10, 5, 2, 1 }, count[7], change; int i, j, sum; while (cin >> change, change) { for (i = 0; i < 7; i++) { count[i] = change / value[i]; change