FZU 2086 餐厅点餐(枚举)

题意:有a种汤,b种饭,c种面条,d种荤菜,e种素菜。

Jack每顿饭都会点1~2样荤菜d,1~2样素菜e(不重复)。

同时,在Jack心情好的时候,会点一样饭b,再配上一种汤a。

在心情不好的时候,就只吃一种面条c。

总价在min~max之间。

Jack想知道,总共有多少种不同的点餐方案。


思路:暴力枚举


代码:

#include<iostream>
#include<stdio.h>
using namespace std;


int main(){
	int t;
	int a,b,c,d,e;
	int pa[15],pb[15],pc[15],pd[15],pe[15];
	int min,max;
	scanf("%d",&t);

	while(t--){
		scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
		int i;
		for(i=0;i<a;i++)	scanf("%d",&pa[i]);
		for(i=0;i<b;i++)	scanf("%d",&pb[i]);
		for(i=0;i<c;i++)	scanf("%d",&pc[i]);
		for(i=0;i<d;i++)	scanf("%d",&pd[i]);
		for(i=0;i<e;i++)	scanf("%d",&pe[i]);
		scanf("%d%d",&min,&max);

		int ai,bi,ci,di,ei;
		int di2,ei2;
		int sum;
		int ans=0;
		for(di=0;di<d;di++){
			for(ei=0;ei<e;ei++){
				for(bi=0;bi<b;bi++){
					for(ai=0;ai<a;ai++){
						sum=pd[di]+pe[ei]+pb[bi]+pa[ai];
						if(sum>=min&&sum<=max) ans++;
					}
				}
				for(ci=0;ci<c;ci++){
					sum=pd[di]+pe[ei]+pc[ci];
					if(sum>=min&&sum<=max) ans++;
				}
			}
		}
		for(di=0;di<d;di++){
			for(ei=0;ei<e;ei++){
				for(ei2=ei;ei2<e;ei2++){//枚举时注意从ei开始就行,不要从0开始,否则会重复
					if(ei!=ei2){
						for(bi=0;bi<b;bi++){
							for(ai=0;ai<a;ai++){
								sum=pd[di]+pe[ei]+pb[bi]+pa[ai]+pe[ei2];
								if(sum>=min&&sum<=max) ans++;
							}
						}
						for(ci=0;ci<c;ci++){
							sum=pd[di]+pe[ei]+pc[ci]+pe[ei2];
							if(sum>=min&&sum<=max) ans++;
						}
					}
				}
			}
		}
		for(di=0;di<d;di++){
			for(di2=di;di2<d;di2++){
				if(di!=di2){
					for(ei=0;ei<e;ei++){
						for(bi=0;bi<b;bi++){
							for(ai=0;ai<a;ai++){
								sum=pd[di]+pe[ei]+pb[bi]+pa[ai]+pd[di2];
								if(sum>=min&&sum<=max) ans++;
							}
						}
						for(ci=0;ci<c;ci++){
							sum=pd[di]+pe[ei]+pc[ci]+pd[di2];
							if(sum>=min&&sum<=max) ans++;
						}
					}
				}
			}
		}
		for(di=0;di<d;di++){
			for(di2=di;di2<d;di2++){
				if(di!=di2){
					for(ei=0;ei<e;ei++){
						for(ei2=ei;ei2<e;ei2++){
							if(ei!=ei2){
								for(bi=0;bi<b;bi++){
									for(ai=0;ai<a;ai++){
										sum=pd[di]+pe[ei]+pb[bi]+pa[ai]+pd[di2]+pe[ei2];
										if(sum>=min&&sum<=max) ans++;
									}
								}
								for(ci=0;ci<c;ci++){
									sum=pd[di]+pe[ei]+pc[ci]+pd[di2]+pe[ei2];
									if(sum>=min&&sum<=max) ans++;
								}
							}
						}
					}
				}
			}
		}
		printf("%d
",ans);
	}
	return 0;
}


代码2:某超,超哥好猛,代码就是短奋斗

#include <iostream>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int a,b,c,d,e,mins,maxs;
        int x1[10],x2[10],x3[10],x4[10],x5[10];
        int i,j,count1=0;
        int s1,s2,s3,s4,s5,sum1,sum2,sum3,sum4;
        cin>>a>>b>>c>>d>>e;
        for(i=0;i<a;i++)
            cin>>x1[i];
        for(i=0;i<b;i++)
            cin>>x2[i];
        for(i=0;i<c;i++)
            cin>>x3[i];
        for(i=0;i<d;i++)
            cin>>x4[i];
        for(i=0;i<e;i++)
            cin>>x5[i];
        cin>>mins>>maxs;
        for(s4=0;s4<d;s4++)
        {
            for(i=s4;i<d;i++)
            {
                if(i==s4) sum1=x4[s4];
                else sum1=x4[s4]+x4[i];
                for(s5=0;s5<e;s5++)
                {
                   for(j=s5;j<e;j++)
                   {
                       if(j==s5) sum2=x5[s5];
                       else sum2=x5[s5]+x5[j];
                       for(s2=0;s2<b;s2++)
                          for(s1=0;s1<a;s1++)
                          {
                            sum3=x2[s2]+x1[s1];
                            int sum=sum1+sum2+sum3;
                            if(sum>=mins&&sum<=maxs)
                              count1++;
                          }
                       for(s3=0;s3<c;s3++)
                        {
                           sum4=x3[s3];
                           int sum=sum1+sum2+sum4;
                           if(sum>=mins&&sum<=maxs)
                              count1++;
                        }
                    }
                 }
             }
         }
        cout<<count1<<endl;
      }
      return 0;
}


原文地址:https://www.cnblogs.com/gongpixin/p/4477383.html