记录编号 307711 评测结果 AAAAAAAAAA
题目名称 搭配购买 最终得分 100
用户昵称 Gravataropen the window 是否通过 通过
代码语言 C++ 运行时间 0.569 s
提交时间 2016-09-16 08:59:54 内存使用 0.87 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#define IP 20001
using namespace std;
int t[IP],c[IP],f[IP],ts[IP],cs[IP],z[IP],fz[IP];
bool v[IP];
int n,m,w,x,y,tot;
int max(int a,int b)
{
	return a>b? a:b;
}
int find(int p)
{
	if (f[p]!=p) f[p]=find(f[p]);
	return f[p];
}
int main()
{
	freopen("buy.in","r",stdin);
	freopen("buy.out","w",stdout);
	int i,j,k;
	scanf("%d%d%d",&n,&m,&w);
	for (i=1; i<=n; ++i) 
	{
		scanf("%d%d",&t[i],&c[i]);
		f[i]=i;
	}
	for (i=1; i<=m; ++i)
	{
		scanf("%d%d",&x,&y);
		int tx=find(x),
			ty=find(y);
		if (tx!=ty) f[tx]=ty;
	}
    for (i=1; i<=n; ++i)
	{
		k=find(i);
		if (!v[k])
		{
            tot++;
            ts[tot]+=t[i];
			cs[tot]+=c[i];
			z[k]=tot;
			v[k]=true;
		}
		else 
		{
			ts[z[k]]+=t[i];
			cs[z[k]]+=c[i];
		}
	}
    for (i=1; i<=tot; ++i)
	 for (j=w; j>=ts[i]; --j)
	  fz[j]=max(fz[j],fz[j-ts[i]]+cs[i]);
	printf("%d\n",fz[w]);
	return 0;
}