@[zfznbnb](/user/608251)
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,w,c[10001],v[10001],a,b,f[10001],dp[10001];
int find(int a){
if(f[a]==a)return a;
return f[a]=find(f[a]);
}
int main(){
cin>>n>>m>>w;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=n;i++){
cin>>c[i]>>v[i];
}
for(int i=1;i<=m;i++){
cin>>a>>b;
f[find(a)]=find(b);
}
//for(int i=1;i<=n;i++)cout<<c[i]<<" "<<v[i]<<" ";
for(int i=1;i<=n;i++)
{
if(f[i]!=i)
{
c[find(i)]+=c[i];
c[i]=0;
v[find(i)]+=v[i];
v[i]=0;
}
}
// for(int i=1;i<=n;i++)cout<<c[i]<<" "<<v[i]<<" "<<endl;
for(int i=1;i<=n;i++){
for(int j=w;j>=0;j--){
if(c[i]<=j)
dp[j]=max(dp[j],dp[j-c[i]]+v[i]);
}
}
cout<<dp[w];
return 0;
}
```
已改好,原因是最后01背包不应写 $c_{find(i)}$,而是应该写 $c_{i}$,因为前面累加的时候已经以祖先累加了。
by Nwayy @ 2022-12-04 07:08:42
@[winds888](/user/664744) 明白了,谢谢
by zfznbnb @ 2022-12-07 20:46:12