#include<bits/stdc++.h>
using namespace std;
int n,m,w,f[10005],money[10005],v[10005],ans(0),dp[10005],used[10005],k(0);
int ww[10005],mm[10005];
int find(int x)
{
    if(f[x]==x)return x;
    return find(f[x]);
}
void UN(int x,int y)
{
    int a=find(x);
    int b=find(y);
    f[a]=b;
    money[b]+=money[a];
    v[b]+=v[a];
}
int main()
{
	scanf("%d%d%d",&n,&m,&w);
	for(int i=1;i<=n;i++)
	scanf("%d %d",&money[i],&v[i]);
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++)
	{
		int ll,kk;
		scanf("%d%d",&ll,&kk);
		UN(ll,kk);
	}
	for(int i=1;i<=n;i++)
	{
		int a=find(i);
		if(a==i)
		{
           k++;
           ww[k]=money[i];
           mm[k]=v[i];
		}
	}
	for(int i=1;i<=k;i++)
	{
		for(int j=w;j>=ww[i];j--)
		{
			dp[j]=max(dp[j],dp[j-ww[i]]+mm[i]);
		}
	}
	cout<<*max_element(dp+1,dp+1+w);
	return 0;
}
原文:http://www.cnblogs.com/647Z/p/7363059.html