题意:有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; }