回溯算法求组合数
1.组合数
问题描述:找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=10)个数的所有组合。
要求:输入n、r,按特定顺序输出所有组合
1 int a[N]; 2 //用回溯法求组合问题 3 void combine_huisu(int n,int r) 4 { 5 int i=0; 6 int j; 7 a[i]=1; 8 9 do 10 { 11 if(a[i]<=n-r+i+1)//满足条件的解空间 12 { 13 if(i==r-1)//集齐r个数,输出 14 { 15 for(j=0;j<r;j++) 16 { 17 printf("%d ",a[j]); 18 } 19 a[i]++; 20 continue; 21 } 22 else//没有集齐r个数,继续集 23 { 24 i++;//进入下一位 25 a[i]=a[i-1]+1;//下一位的值比前一位大1 26 } 27 } 28 else//不在满足解空间的条件,回溯或退出 29 { 30 if(i==0) 31 { 32 return; 33 } 34 else 35 { 36 i--; 37 a[i]++; 38 } 39 } 40 }while(1); 41 }
参考来源:http://blog.csdn.net/jiuyueguang/article/details/10230221