凑钱问题

来源:互联网 发布:希特勒恶魔的崛起知乎 编辑:程序博客网 时间:2024/06/07 06:55

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 }


 

原创粉丝点击