C语言之枚举法

浅谈C语言枚举法

1.枚举法:顾名思义,枚举法就是将所有可能的情况一一枚举出来,再进行筛选,找出符合条件的情况。
例题:乒乓球队分配问题:甲、乙两个球队比赛,甲乙各出3人进行比赛,甲出A,B,C 3人,乙出X,Y,Z 3人进行比赛,已知A不和X比,C不和X,Z比,编程求甲乙比赛名单;
解:A的对手只有X,Y,Z 3人,B的对手也是X,Y,Z 3人,同样C的对手也是X,Y,Z 3人,总的分配方案有3 * 3 * 3=27种,不符合的情况:A不和X比,C不和X,Z比,还有A的对手,B的对手,C的对手不能相同;去掉这些不符合的情况就是所求的分配方案;代码看下:

for(char a='X';a<='Z';a++)//A的对手就是a
 {
  for(char b='X';b<='Z';b++)//B的对手就是b
  {
   for(char c='X';c<='Z';c++)//C的对手就是c
   {
    if(a!='X'&&c!='X'&&c!='Z'&&a!=b&&a!=c&&b!=c)//不符合条件的情况
     printf("A->%c,B->%c,C->%c\n",a,b,c);
   }
  }
 }

编译结果为:A的对手Z,B的对手X,C的对手Y;

2.经典笔试题:在一个陌生的国度,有5种不同的硬币单位:15、23、29、41和67(分)。寻找所有组成18元8分(即1808分)的可能组合。假定对于所有面值的硬币你都有足够的硬币。
解:这道题也是一道经典的用枚举法求解的题。首先15分的硬币从0(最少)到1808/15种(最多);同理23分硬币0 ~ 1808/23(做除法);29分硬币0 ~ 1808/29;41分硬币0 ~ 1808/41;67分硬币0 ~ 1808/67;这样15、23、29、41、67分硬币只需满足15 * i+23 * j+29 * k+41 * h+67 * s=1808就是符合条件的组合;其中i,j,k,h,s都是在对应的硬币的范围之内(最少到最多);
代码如下:

for(int i=0;i<=n/15;i++)//15分硬币
 {
  for(int j=0;j<=n/23;j++)//23分硬币
  {
   for(int k=0;k<=n/29;k++)//29分硬币
   {
    for(int h=0;h<=n/41;h++)//41分硬币
    {
     for(int s=0;s<=n/67;s++)//67分硬币
     {
      if(i*15+j*23+k*29+h*41+s*67==n)
      {
       printf("15分硬币%d个,23分硬币%d个,29分硬币%d个,41分硬币%d个,67分硬币%d个\n",i,j,k,h,s);
     }
     }
    }
   }
  }
 }

结果可自行编译求解;


以上就是枚举法的一些简单应用,枚举法在C语言中是一个很重要的方法,其思想在C语言编程中有很多体现,希望对大家有帮助。。。


你可能感兴趣的:(C语言)