暴力 枚举
枚举:在所确定的一定范围内,对每一个可能的目标解进行检测,找出所有的目标解。枚举也称作暴力求解,穷举法。
枚举的特征:
- 对所有的可能的目标解,进行一一检测。
- 枚举思想很简单,没有太大的思维量。(只要不超时,不超内存空间,枚举都是一种很好的方法)
提示:当想不出来别的算法时,就用枚举吧!
优化枚举方法,就是指缩小你的检测范围和优化检测方法。随着你对题目的认识的加深,以及积累了大量的做题经验,你才能够来优化你的枚举方法。
例题:韩信点兵
相传韩信从不直接清点自己的军队的人数。只要他的士兵先后以三人一排,五人一排,七人一排的变化对象,而他每次只掠一眼队伍的排尾就知道人数了。输入3个非整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不超过100.
输入:2 1 6
2 1 3
输出:41
No answer
1 #include<stdio.h> 2 int main() 3 { 4 int i,flag,a,b,c; 5 6 while(scanf("%d%d%d",&a,&b,&c)!=EOF) 7 { 8 for(i=1;i<100;i++) 9 { 10 flag=0; 11 if(i%3!=a)flag=1; 12 if(i%5!=b)flag=1; 13 if(i%7!=c)flag=1; 14 if(flag==0)break; 15 } 16 if(flag==0)printf("%d\n",i); 17 else 18 printf("No answer!"); 19 } 20 return 0; 21 }
- 提醒一下,大家最好注意我们的代码书写习惯,比如上述中,我们的flag可以用k代替,当用flag可以方便别人阅读,方便自己调试修改。所以要养成这个习惯。
- 经过观察我们发现,对于已经满足目标解一定是a+3x的形式,同样对5和7也满足类似的公式。那么我们可以改变递增的方式。
改进的代码:
1 #include<stdio.h> 2 int main() 3 { 4 int flag,a,b,c,answer; 5 6 while(scanf("%d%d%d",&a,&b,&c)!=EOF) 7 { 8 answer=a;flag=0; 9 for(;answer<100;answer+=3) 10 if(answer%5==b) 11 { 12 flag++; 13 break; 14 } 15 for(;answer<100;answer+=15) 16 if(answer%7==c) 17 { 18 flag++; 19 break; 20 } 21 if(flag==2)printf("%d\n",answer); 22 else 23 printf("No answer!"); 24 } 25 return 0; 26 }
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char str[3][20]; 6 int i,j,k,num,duan[2],weigh[2]={1,-1}; 7 int isthis,num_space,w; 8 char c,flag; 9 10 gets(str[0]); 11 12 gets(str[1]); 13 14 gets(str[2]); 15 16 for(i=0;i<12;i++) 17 { 18 c=i+'A';flag=' '; 19 // printf("******************%c*********************\n",c); 20 for(k=0;k<2;k++) 21 { 22 isthis=0;w=weigh[k]; 23 for(j=0;j<3;j++) 24 { 25 duan[0]=duan[1]=0; 26 num=strchr(str[j],c)-str[j]; 27 // printf("num=%d\n",num); 28 num_space=strchr(str[j],' ')-str[j]; 29 // printf("num_space=%d\n",num_space); 30 // printf("%c %d\n",str[j][num_space*2+1],num_space*2+1); 31 32 if(num>=0&&num<num_space) 33 duan[0]=w; 34 if(num>num_space) 35 duan[1]=w; 36 num=duan[0]-duan[1]; 37 // printf("zhi=%d\n",num); 38 if(num==-1) 39 flag='d'; 40 if(num==0) 41 flag='e'; 42 if(num==1) 43 flag='u'; 44 // printf("flag=%c\n",flag); 45 46 if(flag!=str[j][num_space*2+2]) 47 break; 48 else 49 isthis++; 50 } 51 if(isthis==3) 52 { 53 printf("%c %d\n",i+'A',weigh[k]); 54 break; 55 } 56 57 } 58 } 59 return 0; 60 }
1307 A Mathematical Curiosity 穷举法
1308 Safecracker 穷举法
1197 Number Guessing 搜索:穷举
1186 Calling Extraterrestrial Intelligence Again 搜索:枚举法
1497 Coin Change 暴力求解
1609 Moo University - Team Tryouts 排序+穷举法
1613 The Cow Lineup 穷举法
1627 Rigging the Bovine Election 穷举法
1629 Muddy Fields 穷举法
1647 Securing the Barn 穷举法
1668 DNA Assembly 穷举法
1670 Cellphones 穷举法
1673 Backward Digit Sums 穷举法
1687 Big Square 穷举法
1688 Round Numbers 枚举二进制位
1795 The Cow Doctor 穷举法