排列组合的实现

 

// 实现排列A(n,m) ,c461 
#include <stdio.h>
int m,n,a[30]; long s=0;
void main()
{ int p(int k);
  printf(" input n  (n<10):"); scanf("%d",&n);
  printf(" input m(1<m<=n):"); scanf("%d",&m);
  p(1);                             // 从第1个数开始  
  printf("\n 总数为:%ld \n", s);    // 输出A(n,m)的值  
}
// 排列递归函数p(k)  
int p(int k)
{ int i,j,u;
  if(k<=m)
    { for(i=1;i<=n;i++)     
       { a[k]=i;            // 探索第k个数赋值i  
         for(u=0,j=1;j<=k-1;j++)
                if(a[k]==a[j])  //  若出现重复数字  
u=1;        // 若第k数不可置i,则u=1  
if(u==0)           // 若第k数可置i,则检测是否到m个数  
           { if(k==m)       // 若已到m个数时,则打印出一个解 
                  { s++; printf(" ");
                for (j=1;j<=m;j++)
                   printf("%d",a[j]);
                    if(s%10==0) printf("\n");
                   } 
             else  
                   p(k+1);     // 若没到m个数,则探索下一个数 p(k+1) 
            }
        }
}
return s;
}


// 递归实现组合C(n,m),c462  
#include <stdio.h>
int m,n,a[100]; long s=0;
void main()
{ int c(int k);
  printf(" input n  (n<10):"); scanf("%d",&n);
  printf(" input m(1<m<=n):"); scanf("%d",&m);
  c(1);                                  // 从第1个数开始  
  printf("\n C(%d,%d)=%ld \n",n,m,s);    // 输出C(n,m)的值  
}
// 组合递归函数c(k)  
int c(int k)
{ int i,j;
  if(k<=m)
    { a[0]=0;
          for(i=a[k-1]+1;i<=n+k-m;i++)     
        { a[k]=i;            // 探索第k个数赋值i  
           { if(k==m)        // 若已到m个数时,则打印出一个解 
                  { s++; printf(" ");
                for (j=1;j<=m;j++)
                   printf("%d",a[j]);
                    if(s%10==0) printf("\n");
                   } 
             else  
                   c(k+1);     // 若没到m个数,则探索下一个数 c(k+1) 
            }
        }
}
return s;
}



// 从n个不同元素取r个与另m个相同元素的复杂排列,c463  
#include <stdio.h>
int m,n,r,a[30]; long s=0;
void main()
{ int p(int k);
  printf(" input n: "); scanf("%d",&n);
  printf(" input r(1<r<=n): "); scanf("%d",&r);
  printf(" input m: "); scanf("%d",&m);
  printf(" 从%d个不同元素取%d个与另%d个相同元素的排列:\n",n,r,m);
  p(1);                       // 从第1个数开始  
  printf("\n s=%ld \n",s);    // 输出复杂排列的个数  
}
// 复杂排列递归函数  
int p(int k)
{ int h,i,j,u;
  if(k<=r+m)
    { for(i=0;i<=n;i++)     
      { a[k]=i;                    // 探索第k个数赋值i  
        for(u=0,j=1;j<=k-1;j++)
             if(a[j]!=0 && a[k]==a[j]) // 若出现非零元素相同,则u=1   
u=1;              
if(u==0)              // 若第k数可置i,则检测是否r+m个数  
           { if(k==r+m)       // 若已到r+m个数则检测0的个数h 
                  { for(h=0,j=1;j<=r+m;j++)  
                   if(a[j]==0) h++;
                if(h==m)      // 若相同元素0的个数为m个,输出一排列        
                     { s++; printf(" ");
                   for(j=1;j<=r+m;j++)
                     printf("%d",a[j]);
                       if(s%10==0) printf("\n");
                     }
                   } 
            else p(k+1);     // 若没到r+m个数,则探索下一个数 p(k+1) 
          }
     }
}
return s;
}

 

转载于:https://www.cnblogs.com/liao-pxsoftware15/p/8007504.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值