比赛 20121108 评测结果 AAAAAAAAAAAWAAWWWWAA
题目名称 还是“金明的预算方案” 最终得分 75
用户昵称 临轩听雨ゐ 运行时间 0.231 s
代码语言 C++ 内存使用 3.16 MiB
提交时间 2012-11-08 09:57:01
显示代码纯文本
/*
#include <fstream>
#include <cstdlib>
#include <cstdio>
using namespace std;

struct 
{
	int v,w,l,r;
}a[61];
int n,m,s;
int p[61]={0};
int f[61][3201]={0};
int main()
{
	ifstream in("budgetb.in");
	ofstream out("budgetb.out");
	in>>n>>m>>s;
	n/=10;
	for(int i=1;i<=m;i++) for(int j=0;j<=n;j++) f[i][j]=-1;
	for(int i=0;i<=m;i++){ a[i].l=-1; a[i].r=-1;}
	a[0].w=0;
	for(int i=1;i<=m;i++)
	{
		int b,c,d;
		in>>b>>c>>d;
		b/=10;
		a[i].v=b;
		a[i].w=b*c;
		if(a[d].l=-1) a[d].l=i;
		else a[p[q]].r=i;
		p[q]=i;
	}
	for(int i=1;i<=m;i++)
	{
		if(a[i].l==-1 && a[i].r==-1)
			for(j=0;j<=n;j++)
			{
				if(j>=a[i].v)  f[i][j]=a[i].w;
				else f[i][j]=0;
			}
	}
	trdp(1,n);
	return 0;
}
*/
//  看来最多也就写个建树了,再好好看看吧 唉。。。。  50%  我来了



#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
	ifstream in("budgetb.in");
	ofstream out("budgetb.out");
	int n,m,s;
	int a[61][4]={0},b[61][4]={0};
	int f[32001]={0};
	in>>n>>m>>s;
	for(int i=1;i<=m;i++)
	{
		int v,p,q;
		in>>v>>p>>q;
		if(q==0)
		{
			a[i][0]=v;
			b[i][0]=p;
		}else
		{
			if(a[q][1]==0)
			{
				a[q][1]=v;
				b[q][1]=p;
			}else
			{
				a[q][2]=v;
				b[q][2]=p;
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(a[i][0]!=0)
		{
			for(int j=n;j>=1;j--)
			{
				int a1,a2,a3,a4;
				a1=j-a[i][0];
				a2=j-a[i][0]-a[i][1];
				a3=j-a[i][0]-a[i][1]-a[i][2];
				a4=j-a[i][0]-a[i][2];
				if(a1>=0) f[j]=max(f[j],f[a1]+b[i][0]*a[i][0]);
				if(a2>=0) f[j]=max(f[j],f[a2]+b[i][0]*a[i][0]+b[i][1]*a[i][1]);
				if(a3>=0) f[j]=max(f[j],f[a3]+b[i][0]*a[i][0]+b[i][1]*a[i][1]+b[i][2]*a[i][2]);
				if(a4>=0) f[j]=max(f[j],f[a4]+b[i][0]*a[i][0]+b[i][2]*a[i][2]);
			}
		}
	}
	out<<f[n]<<endl;
	return 0;
}