快餐问题
Description
Peter最近在 R 市开了一家快餐店,为了招揽顾客,该快餐店准备推出一种套餐,该套餐由
价格便宜。为了提高产量,Peter从著名的麦当劳公司引进了 N 条生产线。
所有的生产线都可以生产汉堡,薯条和饮料,由于每条生产线每天所能提供的生产时间是有限的、不同的,而汉堡,薯条和饮料的单位生产时间又不同。
这使得Peter很为难,不知道如何安排生产才能使一天中生产的套餐产量最大。
请你编一程序,计算一天中套餐的最大生产量。
为简单起见,假设汉堡、薯条和饮料的日产量不超过
Input
第一行为三个不超过 100 的正整数 A、
第二行为
中间以一个空格分开。
第三行为为一个整数 N
第四行为
Output
仅一行,即每天套餐的最大产量。
Sample Input
2 2 2
1 2 2
2
6 6
Sample Output
1
Solution
设
则,
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;
}