枚举算法总结

暴力枚举

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_46127031/article/details/103822937