记录编号 294916 评测结果 AAAAAAAAAA
题目名称 [HNOI 1999] 快餐问题 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 1.071 s
提交时间 2016-08-12 21:04:15 内存使用 0.30 MiB
显示代码纯文本
#include<cstdio>
#include<queue>
using namespace std;
int A,B,C,p1,p2,p3,n,t[20],na,nb,nc;
int dp[110][110];
//check[i][j]表示生产i个A,j个B,最多生产的C 
inline int min(int a,int b){
	return a<b?a:b;
}
inline int max(int a,int b){
	return a>b?a:b;
}
inline int min(int a,int b,int c){
	return min(min(a,b),c);
}

int main()
{
	freopen("meal.in","r",stdin);
	freopen("meal.out","w",stdout);
	scanf("%d%d%d",&A,&B,&C);
	scanf("%d%d%d",&p1,&p2,&p3);
	scanf("%d",&n);
	int sum=0;
	for (int i=1;i<=n;i++)
		scanf("%d",&t[i]),sum+=t[i];
	int Min=min(100/A,100/B,100/C);
	Min=min(Min,sum/(A*p1+B*p2+C*p3));
	na=A*Min;nb=B*Min;nc=C*Min;
	for (int i=0;i<=na;i++)
	for (int j=0;j<=nb;j++)
		dp[i][j]=-99999999;
	dp[0][0]=0;
	for (int i=1;i<=n;i++){
		for (int a=na;a>=0;a--)
		for (int b=nb;b>=0;b--)
		if (dp[a][b]>=0){
			for (int c=na-a;c>=0;c--)
			for (int d=nb-b;d>=0;d--)
			if (c*p1+d*p2<=t[i]){
				int e=(t[i]-c*p1-d*p2)/p3;
				dp[a+c][b+d]=max(dp[a+c][b+d],dp[a][b]+e);
			}
		}
		if (dp[na][nb]>=nc){
			printf("%d\n",Min);return 0;
		}
	}
	int ans=0;
	for (int i=0;i<=na;i++)
	for (int j=0;j<=nb;j++)
	if (dp[i][j]>=0)
		ans=max(ans,min(i/A,j/B,dp[i][j]/C));
	printf("%d\n",ans);
	return 0;
}