首页 > 代码库 > 组合问题非递归

组合问题非递归

组合问题非递归形式:

例如有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个128     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 }
View Code

 

组合问题非递归