回溯法之组合数问题
题目链接: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 }