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; }