问题:现有现金a,并且有n种面额的零钱,问,共有多少种找零方式。
问题细化:现有现金1元,并且有50分,25分,10分,5分,1分五种面额,用这5种零钱组成1元,共有多少种方式?
如果把n种零钱按照某种顺序排列(如50分,25分,10分,5分,1分,不一定升序或降序,也可以乱序),那么问题可以转化为:
现金a用除第一种零钱之外其他面额的找零方式数目
加上
现金a-d用所有面额的找零方式数目,其中d为第一种零钱的面额
为什么?什么逻辑?有点晕,看不懂?没关系接着往下看。
上面的逻辑等同于
使用第一种零钱的次数为0次,现金a找零方式数目
加上
使用第一种零钱的次数为>=1次,现金a找零方式数目
如果减去1个第一种零钱,那么等价于“使用第一种零钱的次数为>=0次,现金a-d找零方式数目”,亦即“现金a-d用所有面额的找零方式数目,其中d为第一种零钱的面额”
弄明白上面的逻辑,就看例子吧:以50分,25分,10分,5分,1分为序列,现金额度为1元,则找零方式总数
等于
1元完全不用50分 + 50分用50,25,10,5,1分//现在第一种零钱为50分
等于
1元完全不用50分 + (50分完全不用50分 + 0分用50,25,10,5,1分)//现在第一种零钱为50分
等于
1元用25,10,5,1分 + 50分用25,10,5,1分
//“完全不用50分”等价于”用25,10,5,1分”,“0分用50,25,10,5,1分”是0
等于
(1元完全不用25分 + 75分用25,10,5,1分)// 现在硬币总数只有4种,第一种是25分
+
(50分完全不用25分 + 25分用25,10,5,1分)// 现在硬币总数只有4种,第一种是25分
等于
(1元完全不用25分 + (75分完全不用25分 + 50分用25,10,5,1分))// 现在硬币总数只有4种,第一种是25分
+
(50分完全不用25分 + (25分完全不用25分 + 0分用25,10,5,1分))// 现在硬币总数只有4种,第一种是25分
。。。。一直循环下去
代码实现(js)
1 | const kindsOfCoins = [1, 5, 10, 25, 50]; |
注意,如果const kindsOfCoins = [1, 5, 10, 25, 50];
改为const kindsOfCoins = [50, 10, 5, 1, 25];
得出的结果是一样的,也就是说零钱的随便怎么排序都可以。