【转帖】0-1背包:纸币组合

    有不限数目的1、5、10、20、50面额的纸币,有多少种方法凑出100元?

    笨办法:暴力枚举~

 1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4
5 const int Len = 5;
6 int ans = 0;
7 int m[Len] = {50, 20, 10, 5, 1};
8 int total[Len] = {2, 5, 10, 20, 100};
9 int n[Len];
10 int sum = 100;
11
12 void GetNum(int m[], int n[])
13 {  //方法一:类似于n位k进制枚举,电话号码单词
14 while (true)
15 {
16 int rel = 0;
17 for (int i = 0; i < 5; i++)
18 rel += m[i] * n[i];
19 if (rel == sum)
20 {
21 ans++;
22 for (int i = 0; i < Len; i++)
23 cout << n[i] << " ";
24 cout << endl;
25 }
26
27 int k = Len - 1;
28 while (k >= 0)
29 {
30 if (n[k] < total[k])
31 {
32 n[k]++;
33 break;
34 }
35 else
36 {
37 n[k] = 0;
38 k--;
39 }
40 }
41 if (k < 0)
42 break;
43 }
44
45 }
46
47 void RecursiveGetNum(int m[], int n[], int index)
48 { //方法二:recursion
49 if (index == Len)
50 {
51 int rel = 0;
52 for (int i = 0; i < Len; i++)
53 rel += m[i] * n[i];
54 if (rel == sum)
55 {
56 ans++;
57 for (int i = 0; i < Len; i++)
58 cout << n[i] << " ";
59 cout << endl;
60 }
61 return;
62 }
63 for (n[index] = 0; n[index] <= total[index]; n[index]++)
64 {
65 RecursiveGetNum(m, n, index + 1);
66 }
67
68 }
69
70 int main()
71 {
72 GetNum(m, n);
73 //RecursiveGetNum(m, n, 0);
74 cout << ans << endl;
75 return 0;
76 }



posted on 2011-10-21 14:44  白草黒尖  阅读(305)  评论(0)    收藏  举报