http://codevs.cn/problem/1260/
题目描述 Description
Peter最近在R市开了一家快餐店,为了招揽顾客,该快餐店准备推出一种套餐,该套餐由A个汉堡,B个薯条和C个饮料组成。价格便宜。为了提高产量,Peter从著名的麦当劳公司引进了N条生产线。所有的生产线都可以生产汉堡、薯条和饮料,由于每条生产线每天所能提供的生产时间是有限的、不同的,而汉堡、薯条和饮料的单位生产时间又不同,这使得Peter很为难,不知道如何安排生产才能使一天中生产的套餐产量最大。请你编写程序,计算一天中套餐的最大生产量。为简单起见,假设汉堡、薯条和饮料的日产量不超过100个。
输入描述 Input Description
第一行为三个不超过100的正整数A、B、C,中间以一个空格分开;
第二行为三个不超过100的正整数p1、p2、p3分别为汉堡、薯条和饮料的单位生产耗时。中间以一个空格分开。
第三行为一个整数N(0≤N≤10)代表流水线;
第四行为M个不超过10000的正整数,分别为各条生产流水线每天提供的生产时间,中间以一个空格分开。
输出描述 Output Description
输出文件仅一行,即每天套餐的最大产量。
样例输入 Sample Input
1 2 1
1 2 1
5
16 16 8 9 14
样例输出 Sample Output
10
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstring>
#include <cmath>
#define INF 1000+10
using namespace std;
int main()
{
int a,b,c,n;
int p1,p2,p3;
int ans=0;
int f[15][110][110];
int t[15]={0};
memset(f,-1,sizeof(f));
f[0][0][0]=0;//生产汉堡薯条后最多能生产的饮料数量
cin>>a>>b>>c;
cin>>p1>>p2>>p3;
cin>>n;
for(int i=1;i<=n;i++)
cin>>t[i];
int minn=min(100/a,min(100/b,100/c));//最多能生产的套餐数量
for(int i=1;i<=n;i++)
{
for(int j=0;j<=minn*a;j++)//生产汉堡
{
for(int k=0;k<=minn*b;k++)//生产薯条
{
for(int j1=0;j1<=j;j1++)//分配第i条生产线生产j1个汉堡。
{
for(int k1=0;k1<=k;k1++)//分配第i条生产线生产k1个薯条。
{
if(f[i-1][j-j1][k-k1]!=-1&&t[i]-p1*j1-p2*k1>=0)//必须建立在有数据的基础上,-1就是不可能的状态
{
if(f[i][j][k]>=minn*c)//比最大所需量还要大是没意义的。
{
j1=j+1;
break;
}
f[i][j][k]=max(f[i][j][k],f[i-1][j-j1][k-k1]+(t[i]-p1*j1-p2*k1)/p3);
}
}
}
}
}
}
for(int i=0;i<=minn*a;i++)
for(int j=0;j<=minn*b;j++)
ans=max(ans,min(i/a,min(j/b,f[n][i][j]/c)));//遍搜
cout<<ans<<endl;
return 0;
}