题意:有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\n",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;
}