凑钱问题

Q: 有足够量的2分、5分、1分硬币,请问凑齐1元钱有多少种方法?

我们从简单情况开始分析,假如有足够量的1分硬币,请问凑齐1分钱有多少种方法?毫无疑问,答案是1。然后,凑齐2分钱有多少种方法?凑齐n分钱有多少种方法?答案均是1。

接下来,假如有足够量的1分硬币和2分硬币,凑齐n分钱有多少种方法?对于1分硬币,凑齐任意n分钱都只有1种方法;那么只用1分钱凑齐n-2分钱,有1种方法;只用1分钱凑齐n-4分钱,有1种方法;只用1分钱凑齐n-6分钱,也有1种方法......

由此,用a1~ak种硬币,凑齐n分钱,记做S(k,n)。 可以得到递归公式S(k,n)=∑_S(k-1,n-m*ak)  m=0~n/ak。

代码如下:

  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4
  5 int maxcombine(vector<int> vec, int amount){
  6     int coin = 0;
  7     int coin_number = 1;
  8     int number = 0;
  9
 10     if (vec.size() > 1){
 11         coin = vec.back();
 12         vec.pop_back();
 13     } else {
 14         ++number;
 15         return number;
 16     }
 17
 18     while(coin * coin_number < amount){
 19         number += maxcombine(vec, amount - coin_number*coin);
 20         ++coin_number;
 21     }
 22
 23     return number;
 24 }
 25
 26 int main(){
 27     vector<int> vec;
 28     int amount = 100;
 29     int num = 0;
 30     vec.push_back(1); // 1 is the first element of vector intentionally.
 31     vec.push_back(2);
 32     vec.push_back(5);
 33
 34     num = maxcombine(vec, amount);
 35     cout << "the amount 100 combination count is " << num << endl;
 36
 37     return 0;
 38 }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值