快餐问题

快餐问题


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值