记录编号 312283 评测结果 AAAAAAAAAA
题目名称 [HNOI 1999] 快餐问题 最终得分 100
用户昵称 GravatarGo灬Fire 是否通过 通过
代码语言 C++ 运行时间 2.631 s
提交时间 2016-09-25 21:43:23 内存使用 28.50 MiB
显示代码纯文本
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=210;
int f[maxn][maxn][maxn],a[maxn];int A,B,C,n,ans;
//f[i][j][k]代表前i条生产线生产j个汉堡,k个薯条还可以生产饮料的数量 
int shu,han,yin,maxa,maxb,maxc;
bool Cheak(int,int,int);
void Init();
int main(){
	freopen("meal.in","r",stdin);
	freopen("meal.out","w",stdout);
	Init();
	return 0;
}
void Init(){
	memset(f,-1,sizeof(f));
	f[0][0][0]=0;
	scanf("%d%d%d",&A,&B,&C);//套餐 
	scanf("%d%d%d",&han,&shu,&yin);//单位时间
	scanf("%d",&n);
	int Time=A*han+B*shu+C*yin,m=0,tt=0;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		int k=a[i]/Time;
		m+=k;
		tt+=a[i];
	}
	int _min=100/max(A,max(B,C));//每件最多100个,套餐数是最大的 
	if(m>_min){
		printf("%d",_min);return;
	}
	maxa=min(tt/han,100),maxb=min(tt/shu,100),maxc=min(tt/yin,100);//可以生产的汉堡 薯条 饮料的数量 
	for(int i=1;i<=n;i++){
		for(int j=0;j<=maxa;j++){
			for(int k=0;k<=maxb;k++){
				if(Cheak(i-1,j,k)==1){//如果生产f[i-1][j][k]个饮料还可以生产1个汉堡或1个薯条 
					for(int jj=j;jj>=0;jj--){
						for(int kk=k;kk>=0;kk--){
							int temp=(j-jj)*han+(k-kk)*shu;
							if(temp>=a[i])break;
							int haha=(a[i]-temp)/yin;
							if(f[i-1][jj][kk]!=-1){
								f[i][j][k]=max(f[i][j][k],f[i-1][jj][kk]+haha);
							}
						}
					}
				}
				else f[i][j][k]=f[i-1][j][k];
			}
		}
	}
	for(int i=1;i<=maxa;i++){
		for(int j=1;j<=maxb;j++){
			int haha=min(i/A,min(j/B,f[n][i][j]/C));
			ans=max(haha,ans);
		}
	}
	printf("%d",ans);
}
bool Cheak(int i,int j,int k){
	int temp=f[i][j][k];
	if(temp>maxc){
		if((j<maxa && (temp-maxc)*yin>=han) || (k<maxb && (temp-maxc)*yin>=shu)){
			return 0;
		}
	}
	else return 1;
}