zoukankan      html  css  js  c++  java
  • 排列组合的实现

    // 实现排列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;
    }
  • 相关阅读:
    jvisualm 结合 visualGC 进行jvm监控,并分析垃圾回收
    linux 查看服务器cpu 与内存配置
    arthas 使用总结
    selinux contexts 安全上下文的临时更改
    Android 8.1 Doze模式分析(五) Doze白名单及Debug方式
    Window 任意窗口置顶软件Window TopMost Control
    Android ApkToolPlus一个可视化的跨平台 apk 分析工具
    SVN Please execute the 'Cleanup' command.
    Android 如何在64位安卓系统中使用32位SO库
    Android cmd命令查看apk是32位还是64位?
  • 原文地址:https://www.cnblogs.com/liao-pxsoftware15/p/8007504.html
Copyright © 2011-2022 走看看