记录编号 115428 评测结果 AAAAAAAAAA
题目名称 [NOIP 2006]金明的预算方案 最终得分 100
用户昵称 Gravatar任杰 是否通过 通过
代码语言 C++ 运行时间 0.013 s
提交时间 2014-08-19 16:33:44 内存使用 5.78 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

#define MAX_N 30001
#define MAX_M 60

int N,m;
int v[MAX_M],w[MAX_M],relyon[MAX_M];
int attachcnt[MAX_M];
int attach[MAX_M][MAX_M];
int dp[MAX_N];
int nv[70][10000],nw[70][10000];
int ncnt;
int mcnt[70];

void dfs(int cur,int f,int vt,int wt)
{
	if(attachcnt[f]==0)
	{
		nv[ncnt][mcnt[ncnt]]=v[f];
		nw[ncnt][mcnt[ncnt]]=v[f]*w[f];
		mcnt[ncnt]++;
		return;
	}
	if(cur==attachcnt[f])
	{
		nv[ncnt][mcnt[ncnt]]=vt;
		nw[ncnt][mcnt[ncnt]]=wt;
		mcnt[ncnt]++;
		return;
	}

	int id=attach[f][cur];
	dfs(cur+1,f,vt,wt);
	dfs(cur+1,f,vt+v[id],wt+v[id]*w[id]);
}

int main()
{
	freopen("budget.in","r",stdin);
	freopen("budget.out","w",stdout);

	cin>>N>>m;

	for(int i=0;i<m;i++)
	{
		cin>>v[i]>>w[i]>>relyon[i];

		if(relyon[i])
		{
			int &t=attachcnt[relyon[i]-1];
			attach[relyon[i]-1][t]=i;
			t++;
		}
	}

	ncnt=0;
	for(int i=0;i<m;i++)
	{
		if(!relyon[i])
		{
			dfs(0,i,v[i],w[i]*v[i]);
			ncnt++;
		}
	}

	for(int i=1;i<=ncnt;i++)
	{
		for(int j=N;j>=0;j--)
		{
			for(int k=0;k<mcnt[i-1];k++)
			{
				if(j>=nv[i-1][k])
					dp[j]=max(dp[j],dp[j-nv[i-1][k]]+nw[i-1][k]);
			}
		}
	}

	cout<<dp[N]<<endl;

	return 0;
}