暴力枚举
2倍的问题
运用for循环嵌套一一枚举
#include <bits/stdc++.h>
using namespace std;
int main()
{ int i,n,a[1000],j,d;
while(cin>>n){
if(n==0)
break;
for(i=0;i<n;i++)
cin>>a[i];//开始逐位进行枚举。
for(i=0;i<n;i++){
for(int i1=i+1;i1<n;i1++){
for(int i2=i1+1;i2<n;i2++){
for(int i3=i2+1;i3<n;i3++){
for(int i4=i3+1;i4<n;i4++){
for(int i5=i4+1;i5<n;i5++){
printf("%d %d %d %d %d %d\n",a[i],a[i1],a[i2],a[i3],a[i4],a[i5]);
}
}
}
}
}
}
}
return 0;
}
又一道枚举(有小坑)楼层编号
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,k,t,s,a,b,i;
cin>>m>>t;
k=m;
for(i=1;i<k;i++){
a=i;
while(a>0){
b=a%10;
if(b==t){
m--;
break;}//避免重复删数。
a/=10;
}}
printf("%d",m);
return 0;
}
求最值枚举
#include <bits/stdc++.h>
using namespace std;
int main()
{
double a,b,c,d,sum,t;
double x,y;
while(cin>>a>>b>>c>>d){
t=999;
for(x=0;x<100; ){
for(y=0;y<100;)//按题目要求只保留一位小数,故只需每次以0.1来枚举。
{
sum=sqrt(pow(x-a,2)+pow(y-b,2))+sqrt(pow(x-c,2)+pow(y-d,2));
if(sum<t)
t=sum;
y+=0.1;
}
x+=0.1;}
printf("%.1f\n",t);
}
return 0;
}
二进制枚举
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n,a[30],i,j,sum,y,t,k;
int ans=0;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
cin>>sum;
for(i=0;i<(1<<n);i++){
y=k=0;
t=sum;
for(j=0;j<n;j++)
if(i&(1<<j)){
y+=a[j];
k++;}
if(k%4==0&&(t-y)%4==0&&k!=0&&k!=n&&(t-y)>=0)//结合题目要求判断是否符合。
ans++;}
printf("%d",ans);
return 0;
}
二进制枚举
#include <bits/stdc++.h>
using namespace std;
int main()
{ int n,i,k,c,d,t;
double a[15][15],b[100],ans=1,sum=0;
cin>>t;
while(t--){
sum=0;
cin>>n;
for(k=0;k<3;k++)
for(i=0;i<n;i++)
cin>>a[k][i];//读入数据。
cin>>d;
for(i=0;i<n;i++)
b[i]=1-(1-a[0][i])*(1-a[1][i])*(1-a[2][i]);//每题做出来的概率。
for(i=0;i<(1<<n);i++){//所有做题的可能。
c=0;
ans=1.0;
for(int j=0;j<n;j++){
if(i&(1<<j)){
c++;
ans*=b[j];}
else
ans*=(1-b[j]);}
if(c==d)
sum+=ans;
}
printf("%.4f\n",sum);}
return 0;
}