01010111011
看到这道题,我的第一思路就是排列组合,比如输入n=2 ,m=3 ,那就是有2个0和3个1 , 再对这5个数进行排列,用递归的思想。
第一位排0,则再对剩下的n-1和m排列
第一位排1,则再对剩下的n和m-1排列
利用这种思想也很容易得出总共的排列次数
我的代码如下
#include<stdio.h> #include<stdlib.h> int total(int n,int m) //用来计算n和0和m个1排列的总个数 { if(n==0 || m==0) return 1; else return (total(n-1,m)+total(n,m-1)); } void findthekth(int pailie[] ,int n,int m,int len ,int k,int index,int *count) { int i; if( index >= len ) { (*count)=(*count)+1; if((*count) == k) { for(i=0;i<len;i++) { printf("%d",pailie[i]); } printf("\n"); } return ; } if(n>0) //0的个数比0大 { pailie[index] = 0; findthekth(pailie,n-1,m,len,k,index+1,count);//剩下n-1个0和m个1去排 } if(m>0) //1的个数比0大 { pailie[index] = 1; findthekth(pailie,n,m-1,len,k,index+1,count);//剩下n个0和m-1个1去排 } } int main() { int num; int n ,m ,k,count ; scanf("%d",&num); int i,j; int * pailie = (int *)malloc((n+m)*sizeof(int)); for(i=0;i<num;i++) { j=0; count = 0; scanf("%d",&n); scanf("%d",&m); scanf("%d",&k); if(k<=total(n,m)) findthekth(pailie,n,m,n+m,k,0,&count); else printf("Impossible\n"); } free(pailie); }