递归之钱币组合

谷歌笔试题:任意不大于10的6次方的钱数,有100,50,20,10,5,1的钞票,给出所有可能数目。

View Code
 1 #include <iostream>
2 #include <iomanip>
3 using namespace std;
4
5 int money;//钱总数
6 int seed[6] = {100,50,20,10,5,1};
7 //假设计算机中int是4字节的,保证放入1000000不溢出
8 int combination[6];//记录每一种组合方式,即每一个seed的个数
9 int cnt;//记录所有组合方式的个数
10
11 void initialize()
12 {
13 cout << "输入钱数:";
14 cin >> money;
15 assert(money >= 0 && money <= 1000000);
16 cnt = 0;
17 for(int i = 0; i < 6; i++)
18 combination[i] = 0;
19 cout << "结果如下:" << endl;
20 cout << setw(7) << 100
21 << setw(7) << 50
22 << setw(7) << 20
23 << setw(7) << 10
24 << setw(7) << 5
25 << setw(7) << 1
26 << endl;
27 }
28
29 void output_combination()
30 {
31 for(int i = 0; i < 6; i++)
32 cout << setw(7) << combination[i];
33 cout << endl;
34 }
35
36 void money_combinate(int m,int order)
37 {
38 if(order == 5){
39 combination[order] = m;
40 cnt++;
41 output_combination();
42 return ;
43 }
44 int max;
45 max = m / seed[order];
46 combination[order] = 0;
47 for(int i = 0; i <= max; i++){
48 combination[order] = i;
49 money_combinate(m-seed[order]*i,order+1);
50 }
51 }
52
53 int main()
54 {
55 initialize();
56 money_combinate(money,0);//从100开始
57 cout << "总共" << cnt << "种分解方式!" << endl;
58 return 0;
59 }



posted @ 2011-10-14 01:04  crazykeyboard  阅读(313)  评论(0编辑  收藏  举报