组合问题非递归形式:
例如有5个数,选其中3个数 ,将其模拟成
1 1 1 0 0
1 1 0 1 0
1 1 0 0 1
1 0 1 1 0
1 0 0 1 1
0 1 1 1 0
..........
需要将每次交换后的1结合在一起。
1 #include<cstdio> 2 int b[25]={ 3 0 4 } ; 5 void Print(int len,int r) 6 { 7 int temp=0; 8 for(int i=0;i<len;i++) 9 { 10 if(b[i]==1) 11 { 12 temp++; 13 if(temp!=r) 14 printf("%d ",i+1); 15 else 16 printf("%d\n",i+1); 17 } 18 19 } 20 } 21 22 23 int main(int argc, char *argv[]) 24 { 25 int n,r; 26 scanf("%d%d",&n,&r); 27 //将b初始化为r个1 28 for(int i=0;i<r;i++) 29 b[i]=1; 30 int i; 31 //寻找 1 0 进行移位 32 do{ 33 Print(n,r); 34 for( i=n-1;i>0;i--) 35 { 36 if(b[i]==0&&b[i-1]==1) 37 { 38 int right=0; 39 for(int j=n-1;j>i;j--) 40 { 41 if(b[j]==1) 42 right++; 43 } 44 b[i]=1; 45 b[i-1]=0; 46 //移位 清1 47 for(int j=i+1;j<=i+right;j++) 48 { 49 b[j]=1; 50 } 51 //移位 清0 52 for(int j=i+right+1;j<n;j++) 53 { 54 b[j]=0; 55 } 56 break; 57 } 58 } 59 }while(i!=0); 60 61 62 63 return 0; 64 }
时间: 2024-10-10 22:35:12