2022-05-27

人民币找零

常说的找零即:用比该币币值小的币种来等额替换。

人民币找零:即用比该币币值小的币种来等额替换有多少种替换方法。

人民币的币种构成:100元、50元、20元、10元、5元、2元、1元、5角、2角、1角、5 分、2分、1分共13种面额货币。

数学模型:层层递推穷举法;以上一层穷举递推为条件设置下一层的递推条件,以控制删除无效的递推穷举。

计算工具:

联想台式机Lenovo 510。处理器Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz;

内存:8G(机带),

Windos 10专业版,64位操作系统, 基于 x64 的处理器

编程软件:Microsoft  Visual  FoxPro 9.0。

编程思路:

方法1:

对直接采用循环嵌套命令,对循环条件上限给以有效约束,删除无效循环,逐一列举累计。因差额部份由壹分来补,壹分一级的循环取消。

这种方法简单、简练、直观,币值较小时很适用。因简单,巡环嵌套层级没有问题(用FOR-ENDF巡环命令,其嵌套层级可达13层)。但对币值较大时耗时很长。

只使用了一个汇总数据库。

方法2:

1、采用分级计算;对2角以上的各种类型分别穷举,差额部份由2角及分来凑。因其差额部分分别为:0、1×50分、2×50分、……2000×50分,因此要计算出用2角及分来找零以上币值的方法数。

2、对2角以上的采用穷举,并将每一种情况及差额逐一装入数据库。再对应将差额部份用2角及分找零的方法数对应调入到方法数列中。再对该数据库中的方法数一列数字统计汇总就是该币值对应的找零方法总数。

3、因巡环上限是采用逐级迭代控制,算到最后两分这一级时就不需再巡环了,可用一个数学计算式准确计算。使巡环少嵌套一层

4、计算出来的数据再逐一回代计算出总数。

5、使用了一个汇总数据库,分解到2角这一级时包含余额的数据库,用2角表现余额种类的数据库。

6、为什么分级分到2角这一级。这是因为13种币值中有12种要参与递推穷举中,而巡环量大的是下面,上面的巡环量反而小。按一般最优考虑选到5角、2角、1角这三级。选到5角,后面的计算量仍然很大,时间很长。选到1角这一级,当计算100元找零时,第一级计算时要装入数据库中的记录远超数据库的上限1700~1800万条。

方法3:

1、对第二种方法再行优化。第二种方法在计算第二级时仍用时较多,因此考虑为采用三级分解计算:第一级、分解到一元一级,元以后的余额由角、分来穷举。分解到元一级时直接调用后面的数据,进行计算汇总到汇总数据库。

2、分解到一元一级后,余额的表现形式最多有(10000/100+1)种(0是一种特殊情况),第二级再将元以后的余额数分解到一角一级,一角以后的余额由分来穷举。

3、分解到一角一级后,余额的表现形式最多有(10000/10+1)种(0是一种特殊情况),即分解到一角这一级时,无论有多少数据,其余额必然是上面的一种。再计算其用分来找零的方法数就较快了,因这一级的巡环只有一层。

4、计算出来的数据再逐一回代计算出总数。

5、使用了一个汇总数据库,用1元表现余额种类的数据库,用1角来表现余额种类的数据库。装入数据库中的记录最高时只有(10000/10+1)条,与第二种方法相比小得可以忽略了。

方法2较方法1来说,思路复杂、编程也要繁杂些。但效率上却要高得多。

方法3与方法2比较,思路上更复杂一些,编程也要复杂。但效率明显也要高很多。



方法2的算法关键是分级,采用分级虽然使程序变复杂,但算法上明显优于方法1,一是减少的巡环嵌套层级、也就减少了对系统的高要求;二是分级使复杂的巡环嵌套降低为简单的巡环嵌套,提高了效率;三是分级使对数据库容量的要求大为降低。

方法3采用了三次分级与迭代,巡环嵌套层级进一步降低,数据库的数据量也很少,进步降低了对系统资源的占用。其运算时是先计算分解到1 角一级余额种类的找零方法数,其次计算分解到1元一级时余额种类的找零方法数(直接调用角一级的数据),最后计算分解到元一级时直接调用元一级余额种类的数据出结果。当然,思路复杂、编程复杂了,对编程人员的要求高有所加强。

方法2与方法3的巡环层级是前后串联关系,不是包含嵌套,所以虽然巡环有九个,但真正形成嵌套的级数却减少了。

你可能感兴趣的:(2022-05-27)