AcWing 1252. 搭配购买

 

 

#include<bits/stdc++.h>
#define N 10010
using namespace std;
int fa[N],v[N],pr[N];
int vv[N],pp[N],f[N];
int n,m,w,cut;
int  found(int x)
{
    if(fa[x]!=x)fa[x]=found(fa[x]);
    return fa[x];
}
int main()
{
    scanf("%d%d%d",&n,&m,&w);
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=n;i++)
        scanf("%d%d",&v[i],&pr[i]);
    for(int i=1;i<=m;i++)  
    {
        int x,y;
        scanf("%d%d",&x,&y);
        int fx=found(x),fy=found(y);
        fa[fx]=fy;
    }
    for(int i=1;i<=n;i++)
    {
        int x=found(i);
        if(x!=i)
            v[x]+=v[i],pr[x]+=pr[i];
    }
    for(int i=1;i<=n;i++)
        if(found(i)==i)
            vv[++cut]=v[i],pp[cut]=pr[i];

    for(int i=1;i<=cut;i++)
        for(int j=w;j>=vv[i];j--)
            f[j]=max(f[j],f[j-vv[i]]+pp[i]);
    cout<<f[w];
    return 0;
}

 

posted @ 2021-01-31 15:45  君与  阅读(47)  评论(0编辑  收藏  举报