FZU 2086 餐厅点餐(模拟)

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;
}
View Code
原文地址:https://www.cnblogs.com/gpsx/p/5242943.html