快餐问题

来源:互联网 发布:linux hba卡查看 编辑:程序博客网 时间:2024/04/28 12:47

快餐问题


Description

Peter最近在 R 市开了一家快餐店,为了招揽顾客,该快餐店准备推出一种套餐,该套餐由 A 个汉堡,B 个薯条和 C 个饮料组成。
价格便宜。为了提高产量,Peter从著名的麦当劳公司引进了 N 条生产线。
所有的生产线都可以生产汉堡,薯条和饮料,由于每条生产线每天所能提供的生产时间是有限的、不同的,而汉堡,薯条和饮料的单位生产时间又不同。
这使得Peter很为难,不知道如何安排生产才能使一天中生产的套餐产量最大。
请你编一程序,计算一天中套餐的最大生产量。
为简单起见,假设汉堡、薯条和饮料的日产量不超过 100 个。


Input

第一行为三个不超过 100 的正整数 ABC 中间以一个空格分开。
第二行为 3 个不超过 100 的正整数 p1,p2,p3 分别为汉堡,薯条和饮料的单位生产耗时。
中间以一个空格分开。
第三行为为一个整数 N (0<=0<=10),表示有 N 条流水线
第四行为 N 个不超过 10000 的正整数,其中 Ti 表示第 i 条生产流水线每天提供的生产时间,中间以一个空格分开。


Output

仅一行,即每天套餐的最大产量。


Sample Input

2 2 2
1 2 2
2
6 6


Sample Output

1


Solution

f[i][j][k] 表示前 i 个流水线,生产 j 个汉堡,k 个薯条可以生产的最多饮料数。
则,

f[i][j][k]=min{f[i1][jm][kn]+(t[i]p1m+p2m)/p3}


Code

#include <iostream>#include <cstdio>#define Max(x,y) ((x)>(y)?(x):(y))#define Min(x,y) ((x)<(y)?(x):(y))using namespace std;int n,ans,x[4],p[4],t[20],f[20][110][110],s;int main(){    freopen("meal.in","r",stdin);#ifndef DEBUG    freopen("meal.out","w",stdout);#endif    memset(f,0xc0,sizeof f);    f[0][0][0]=0;    scanf("%d%d%d",&x[1],&x[2],&x[3]);    scanf("%d%d%d",&p[1],&p[2],&p[3]);    scanf("%d",&n);    for(int i=1;i<=n;i++)scanf("%d",&t[i]);    for(int i=1;i<=n;i++){        s+=t[i];        int down1=Min(s/p[1],100),down2=Min(s/p[2],100);        for(int j=0;j<=down1;j++)            for(int k=0;k<=down2;k++)                for(int l=0;l<=j;l++){                    for(int c=0;c<=k;c++){                        //if(t[i]<=(l*p[1]+c*p[2])/p[3])break;                        if(t[i]<l*p[1]+c*p[2])break;                        f[i][j][k]=Max(f[i][j][k],f[i-1][j-l][k-c]+(t[i]-(l*p[1]+c*p[2]))/p[3]);                        if(f[i][j][k]>100){                            f[i][j][k]=100;                            ans=Max(ans,Min(Min(f[i][j][k]/x[3],j/x[1]),k/x[2]));                            break;                        }                        if(f[i][j][k]>0)ans=Max(ans,Min(Min(f[i][j][k]/x[3],j/x[1]),k/x[2]));                    }            }    }    printf("%d\n",ans);    return 0;}
0 0