先用并查集把组团购买的直接和为一个商品,再01背包跑最优解
#include<bits/stdc++.h>
using namespace std;
int n,m,w,t1,t2,all;
int q[10005],z[10005],tot,f[10005];
int jq[10005],jz[10005];
struct oppo {
int jq,jz;
} buy[10005];
int ans[10005];
int zx(int f) {
if(f==ans[f])
return f;
return ans[f]=zx(ans[f]);
}
void add(int a,int b) {
int b1=zx(a);
int b2=zx(b);
if(b1!=b2)
ans[b2]=b1;
}
int main() {
cin>>n>>m>>w;
for(int i=1; i<=n; i++) {
scanf("%d %d",&buy[i].jq,&buy[i].jz);
ans[i]=i;
}
for(int i=1; i<=m; i++) {
scanf("%d %d",&t1,&t2);
add(t1,t2);
}
for(int i=1; i<=n; i++)
zx(i);
for(int i=1; i<=n; i++) {
jq[ans[i]]+=buy[i].jq;
jz[ans[i]]+=buy[i].jz;
}
for(int i=1; i<=n; i++) {
if(jq[i]) {
q[++tot]=jq[i];
z[tot]=jz[i];
}
}
for(int j=1; j<=tot; j++)
for(int i=w; i>0; i--)
if(i-q[j]>=0)
f[i]=max(f[i-q[j]]+z[j],f[i]);
cout<<f[w]<<endl;
return 0;
}