• C语言-回溯例2


                 组合问题

    组合:从n个不同元素中取r个不重复的元素组成一个子集,而不考虑其元素的顺序,称为从n个中取r个的无重组合,例如OR = {1,2,3,4}, n = 4, r
    = 3则无重组合为:

    {1,2,3}; {1,2,4}; {1,3,4}; {2,3,4}.

     1 /****************组合******************/
     2 #include <stdio.h>
     3 
     4 int main()
     5 {
     6     int m,n,a[100];
     7     int i,k,j;
     8     int num;//记录解得个数
     9     int flag;//定义标志位,用于判断是否满足条件
    10     printf("输入n(C(n,m)):");
    11     scanf("%d",&n);
    12     printf("输入m(c(n,m)):");
    13     scanf("%d",&m);
    14     i=1;
    15     a[i]=1;//初始值
    16     num=0;
    17     while(1)
    18     {
    19         flag=1;
    20         for(k=i-1;k>=1;k--)
    21         {
    22             if(a[k]>=a[i])//约束条件
    23             {
    24                 flag=0;
    25             }
    26         }
    27         if(flag && (i==m))//输出解
    28         {
    29             num++;
    30             for(j=1;j<=m;j++)
    31             {
    32                 printf("%d",a[j]);
    33             }
    34             printf(" ");
    35             if(num%6==0)
    36                 printf("
    ");
    37         }
    38         if(flag&&i<n)
    39         {
    40             i++;
    41             a[i]=1;//取初值
    42             continue;
    43         }
    44         while(a[i]==n&&i>1)i--;//回溯
    45         if(a[i]==n&&i==1)
    46         {
    47             break;
    48         }
    49         else
    50         {
    51             a[i]++;//搜索下一条路径
    52         }
    53     }
    54     printf("
    组合数C(%d,%d)=%d",n,m,num);
    55     return 0;
    56 }

    运行结果:

  • 相关阅读:
    ASP.NET Core学习——7
    ASP.NET Core学习——6
    ASP.NET Core学习——6
    ASP.NET Core学习——5
    ASP.NET Core学习——4
    平衡的括号(名字怪怪的~)
    找复合单词
    卡片游戏
    Ducci 序列
    卡片游戏O(∩_∩)O
  • 原文地址:https://www.cnblogs.com/xiaojingang/p/3746832.html
Copyright © 2020-2023  润新知