记录编号 549839 评测结果 AAAAAAAAAA
题目名称 [NOIP 2006]金明的预算方案 最终得分 100
用户昵称 Gravatar夜莺 是否通过 通过
代码语言 C++ 运行时间 0.069 s
提交时间 2020-02-25 11:25:51 内存使用 4.54 MiB
显示代码纯文本
#include<cstdio>
using namespace std;
const int MAXN=36010,MAXM=70;
int v[MAXM],p[MAXM];
int vv[MAXM][4],pp[MAXM][4];
int f[MAXN];
int tong[MAXM];
int ber[MAXM];
int n,m,num;
int main(){
	freopen("budget.in","r",stdin);
	freopen("budget.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1,q;i<=m;i++){
		scanf("%d%d%d",&p[i],&v[i],&q);
		v[i]*=p[i];
		if(!q){
			num++;
			tong[i]=num;
			for(int k=0;k<4;k++){
				vv[num][k]=v[i];
				pp[num][k]=p[i];
			}
		}
		else{
			vv[tong[q]][3]+=v[i];
			pp[tong[q]][3]+=p[i];
			ber[tong[q]]++;
			if(vv[tong[q]][1]==vv[tong[q]][0]&&pp[tong[q]][1]==pp[tong[q]][0]){
				vv[tong[q]][1]+=v[i];
				pp[tong[q]][1]+=p[i];
			}
			else{
				vv[tong[q]][2]+=v[i];
				pp[tong[q]][2]+=p[i];
				ber[tong[q]]++;
			}
		}
	}
	//printf("num:\n");
	//for(int i=1;i<=num;i++)
	//	printf("%d ",ber[i]);
	//printf("\nprice:\n");
	//for(int i=1;i<=num;i++)
	//	printf("%d %d %d %d\n",vv[i][0],vv[i][1],vv[i][2],vv[i][3]);
	//printf("heavy:\n");
	//for(int i=1;i<=num;i++)
	//	printf("%d %d %d %d\n",pp[i][0],pp[i][1],pp[i][2],pp[i][3]);
	for(int i=1;i<=num;i++)
		for(int j=n;j>=0;j--)
			for(int k=0;k<=ber[i];k++)
				if(pp[i][k]<=j&&f[j-pp[i][k]]+vv[i][k]>f[j])
					f[j]=f[j-pp[i][k]]+vv[i][k];
	//printf("ans:\n");
	printf("%d",f[n]);
	return 0;
}