回溯法之组合数问题

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=32

 1 /**
 2 时间:2013年1月23日11:35:41
 3 需求:理解回溯法;求解组合数问题;
 4 状态:完成;
 5 */
 6 #include <iostream>
 7 using namespace std;
 8 #define MAX 100
 9 int a[MAX];
10 void combine(int n,int r)
11 {
12     int i=0,j;
13     a[i] = 1;
14     do{
15         if(a[i] <= n-r+1+i)//每一位都有它的最大值
16         {
17             if(i == r-1)//   找到需要输出的位数
18             {
19                 for(j = 0; j < r; j++)
20                     cout<<a[j];
21                 cout<<endl;
22                 a[i]++; //遍历最高位
23                 continue;// 再次循环
24             }
25             else
26             {
27                 i++; //进入下一位
28                 a[i] = a[i-1] + 1 ;//下一位的值总比前一位大一
29 
30             }
31         }
32         else//回溯到上一层,或者结束。
33         {
34             cout<<"a["<<i<<"]="<<a[i]<<endl;
35             if (i == 0)return; //已经回溯到最后,结束。
36             i--;
37             a[i]++;
38         }
39     }while(1);
40 }
41 void combine1(int n,int r)
42 {
43     int i=0,j;
44     a[i] = n;
45     do{
46         if(a[i] >= 1)//每一位都有它的最大值
47         {
48             if(i == r-1)//   找到需要输出的位数
49             {
50                 for(j = 0; j < r; j++)
51                     cout<<a[j];
52                 cout<<endl;
53                 a[i]--; //遍历最低位
54                 continue;// 再次循环
55             }
56             else
57             {
58                 i++; //进入下一位
59                 a[i] = a[i-1] - 1 ;//下一位的值总比前一位小一
60 
61             }
62         }
63         else//回溯到上一层,或者结束。
64         {
65         //    cout<<"a["<<i<<"]="<<a[i]<<endl;
66             if (i == 0)return; //已经回溯到最后,结束。
67             i--;
68             a[i]--;
69         }
70     }while(1);
71 }
72 int main()
73 {
74     int n,r;
75     cin>>n>>r;
76     combine1(n,r);
77     return 0;
78 }

 

posted @ 2013-01-23 12:11  牧童不吃蛋炒饭  阅读(356)  评论(0编辑  收藏  举报