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 }