比赛 20121108 评测结果 AAAAAAAATAAAAAAAAATA
题目名称 还是“金明的预算方案” 最终得分 90
用户昵称 Truth.Cirno 运行时间 4.727 s
代码语言 C++ 内存使用 4.74 MiB
提交时间 2012-11-08 09:28:38
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <memory.h>
using namespace std;

int weii[65],vall[65],to[65];
int num,val[65][3210],numfu,limfu,weifu[65],valfu[65];
int f[65][3210];

int main(void)
{
	freopen("budgetb.in","r",stdin);
	freopen("budgetb.out","w",stdout);
	int i,j,k,lim,n,s,temp;
	cin>>lim>>n>>s;
	lim/=10;
	for (i=1;i<=n;i++)
	{
		cin>>weii[i]>>vall[i]>>to[i];
		vall[i]*=weii[i];
		weii[i]/=10;
	}
	for (i=1;i<=n;i++)
	{
		if (!to[i])
		{
			num++;
			for (j=weii[i];j<=lim;j++)
				val[num][j]=vall[i];
			numfu=0;
			limfu=lim-weii[i];
			for (j=1;j<=n;j++)
			{
				if (to[j]==i)
				{
					numfu++;
					weifu[numfu]=weii[j];
					valfu[numfu]=vall[j];
				}
			}
			memset(f,0,sizeof(f));
			for (j=1;j<=numfu;j++)
				for (k=0;k<=limfu;k++)
				{
					f[j][k]=f[j-1][k];
					temp=k-weifu[j];
					if (temp>=0)
						f[j][k]=max(f[j][k],f[j-1][temp]+valfu[j]);
				}
			/*f[numfu][XXX]*/
			for (j=weii[i],k=0;j<=lim;j++,k++)
				val[num][j]+=f[numfu][k];
		}
	}
	memset(f,0,sizeof(f));
	for (i=1;i<=num;i++)
		for (j=0;j<=lim;j++)
		{
			f[i][j]=f[i-1][j];
			for (k=0;k<j;k++)
				f[i][j]=max(f[i][j],f[i-1][k]+val[i][j-k]);
		}
	cout<<f[num][lim]<<endl;
	/* ans*10? */
	return(0);
}