记录编号 254549 评测结果 AAAAAAAAAA
题目名称 [HNOI 1999] 快餐问题 最终得分 100
用户昵称 Gravatar面对疾风吧 疾风 疾风吧 是否通过 通过
代码语言 C++ 运行时间 1.060 s
提交时间 2016-04-25 14:52:42 内存使用 1.28 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50;
const int maxm=110;
int pro[maxn],f[maxn][maxm][maxm],a,b,c,hum,fre,dri,ans,n;
bool check(int,int,int);
int _h=0,_f=0,_d=0;
void Init();
void work();
int _drink(int,int,int);
int Main();
int haha=Main();
int main(){;}
int Main(){
	freopen("meal.in","r",stdin);
	freopen("meal.out","w",stdout);
	Init();
	return 0;
}
void Init(){
	scanf("%d%d%d%d%d%d",&a,&b,&c,&hum,&fre,&dri);
	int t=a*hum+b*fre+c*dri;
	scanf("%d",&n);
	int _temp=0;int _ans2=0;
	for(int i=1;i<=n;i++){
		scanf("%d",&pro[i]);
		_ans2+=pro[i]/t;
		int _max=pro[i]/t;
		if(_max>3){
			 _max-=3;	
			 pro[i]-=t*_max;
			 ans+=_max;
			
		}
		_temp+=pro[i];
	}
	int x=100/a,y=100/b,z=100/c;
	int _mm=0x7f7f7f7f;
	_mm=min(x,y);
	_mm=min(_mm,z);
	if(_ans2>_mm){
		printf("%d",_mm);
		return;
	}
	//printf("%d",ans);
	_h=_temp/t*a;
	_f=_temp/t*b;
	_d=_temp/t*c;
	//printf("%d _h=%d _f=%d\n",ans,_h,_f);
	if(_h>100)_h=100;
	if(_f>100)_f=100;
	if(_d>100)_d=100;
	work();
	int _max=0;
	for(int i=1;i<=_h;i++){
		for(int j=1;j<=_f;j++){
			int temp=0x7f7f7f7f;
			temp=min(f[n][i][j]/c,i/a);
			temp=min(temp,j/b);
			_max=max(_max,temp);
			//printf("%d\n",hum*a);
			//printf("%d ",f[n][i][j]);
		}
		//printf("\n");
	}
	ans+=_max;
	printf("%d\n",ans);
}
void work(){
	memset(f, -1, sizeof(f));
	f[0][0][0] = 0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=_h;j++){
			for(int k=0;k<=_f;k++){
				if(check(i-1,j,k)){
					for(int j1=0;j1<=j;j1++){
						for(int k1=0;k1<=k;k1++){
							int temp_=_drink(i,j-j1,k-k1);
							if (f[i-1][j1][k1] != -1)
								f[i][j][k]=max(f[i-1][j1][k1]+temp_,f[i][j][k]);
						}
					}
				}
				else{
					f[i][j][k]=f[i-1][j][k];
				}
			}
		}
	}
}
//第i条生产线,生产m个hum,生产n个fre
int _drink(int i,int m,int n){
	int temp;
	int th=m*hum,tf=n*fre;
	temp=pro[i]-th-tf;
	temp=temp/dri;
	return temp;
}
bool check(int i,int j,int k){
	int tmp=f[i][j][k];
	if((tmp>_d&&((tmp-_d)*dri>hum))||(tmp>_d&&(tmp-_d)*dri>fre)){
		return 0;
	}
	return 1;
}