• 排列组合的实现


    // 实现排列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("
     总数为:%ld 
    ", 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("
    ");
                       } 
                 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("
     C(%d,%d)=%ld 
    ",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("
    ");
                       } 
                 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,r,m);
      p(1);                       // 从第1个数开始  
      printf("
     s=%ld 
    ",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("
    ");
                         }
                       } 
                else p(k+1);     // 若没到r+m个数,则探索下一个数 p(k+1) 
              }
         }
    }
    return s;
    }
  • 相关阅读:
    50个网页常用小代码
    web前端题目(持续更新)
    一步步构建大型网站架构(转)
    CentOS下配置node.js
    ajax文件上传
    test
    文件上传input简便美化方案
    String.match()与RegExp.exec()
    ie7下zindex问题
    javascript将数组插入到另一个数组中
  • 原文地址:https://www.cnblogs.com/liao-pxsoftware15/p/8007504.html
Copyright © 2020-2023  润新知