Problem 2086 餐厅点餐
Problem Description
Jack最近喜欢到学校餐厅吃饭,好吃干净还便宜。
在学校餐厅,有a种汤,b种饭,c种面条,d种荤菜,e种素菜。
为了保证膳食搭配,Jack每顿饭都会点1~2样荤菜,1~2样素菜(不重复)。同时,在Jack心情好的时候,会点一样饭,再配上一种汤。在心情不好的时候,就只吃一种面条。
因为经济有限,Jack每次点餐的总价在min~max之间。Jack想知道,总共有多少种不同的点餐方案。
Input
输入数据第一行包含一个整数T,表示测试数据的组数,对于每组测试数据:
第一行为整数a,b,c,d,e(0<a,b,c,d,e<=10)
第二行为a个大于零的整数,表示a种汤的价格
第三行为b个大于零的整数,表示b种饭的价格
第四行为c个大于零的整数,表示c种面条的价格
第五行为d个大于零的整数,表示d种荤菜的价格
第六行为e个大于零的整数,表示e种素菜的价格
第七行为两个整数min max,表示每次点餐的价格范围
Output
对于每组测试数据,输出一行,包含一个整数,表示点餐方案数。
Sample Input
1
2 2 2 2 2
2 3
3 1
5 2
1 4
3 6
5 8
Sample Output
3
Answer
想说:这什么鬼!!!其实这个题目就是一个嵌套(2+(2||1))循环,在买下下一样物品之前,保存现在花的钱,处理完下面的循环再恢复回来。
Code
#include <iostream> #include <cstdio> #include <string> #include <set> #include <algorithm> #include <vector> #include <cstring> #define ms(a) memset(a,0,sizeof(a)) using namespace std; int main() { int N; int a,b,c,d,e,ans,n,m,cnt,save; int va[11],vb[11],vc[11],vd[11],ve[11]; //int via[11],vib[11],vic[11],vid[11],vie[11]; //freopen("in.txt","r",stdin); cin>>N; while(N--) { ans=0; cin>>a>>b>>c>>d>>e; ms(va),ms(vb),ms(vc),ms(vd),ms(ve); //ms(via),ms(vib),ms(vic),ms(vid),ms(vie); for(int i=1; i<=a; i++)cin>>va[i]; for(int i=1; i<=b; i++)cin>>vb[i]; for(int i=1; i<=c; i++)cin>>vc[i]; for(int i=1; i<=d; i++)cin>>vd[i]; for(int i=1; i<=e; i++)cin>>ve[i]; cin>>n>>m; for(int i=1; i<=e; i++) { cnt=ve[i]; //vie[i]=1; save=cnt; //printf("%d ",ve[i]); for(int ii=0; ii<=e; ii++) { if(cnt<n&&cnt>m)break; //if(vie[ii])continue; cnt+=ve[ii]; //printf("%d ",ve[ii]); //vie[ii]=1; int save2=cnt; for(int j=1; j<=d; j++) { if(cnt<n&&cnt>m)break; cnt+=vd[j]; //printf("%d ",vd[j]); //vid[j]=1; int save3=cnt; for(int jj=0; jj<=d; jj++) { if(cnt<n&&cnt>m)break; //if(vid[jj])continue; cnt+=vd[jj]; //printf("%d ",vd[jj]); int save4=cnt; for(int k=1; k<=b; k++) { if(cnt<n&&cnt>m)break; cnt+=vb[k]; //printf("%d ",vb[k]); int save5=cnt; for(int kk=1; kk<=a; kk++) { if(cnt<n&&cnt>m)break; cnt+=va[kk]; //printf("%d ",va[kk]); if(cnt>=n&&cnt<=m)ans++; cnt=save5; //printf(" "); } cnt=save4; } //cnt=save4; for(int k=1; k<=c; k++) { if(cnt<n&&cnt>m)break; cnt+=vc[k]; if(cnt>=n&&cnt<=m)ans++; cnt=save4; } if(jj==0)jj=j; cnt=save3; } cnt=save2; //vid[j]=0; } cnt=save; //vie[ii]=0; if(ii==0)ii=i; } //vie[i]=0; } printf("%d ",ans); } return 0; }