题目:
题解:
将每一种搭配看一整个物品,用并查集处理出最终的物品消息然后用01背包即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int p[N];
int w[N],v[N];
int f[N];
int n,m,vol;
int find(int x){
if(x!=p[x])return p[x]=find(p[x]);
return p[x];
}
int main(){
scanf("%d%d%d",&n,&m,&vol);
for(int i=1;i<=n;i++)p[i]=i;
for(int i=1;i<=n;i++){
scanf("%d%d",v+i,w+i);
}
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
int pa=find(a),pb=find(b);
if(pa!=pb){
w[pb]+=w[pa];
v[pb]+=v[pa];
p[pa]=pb;
}
}
for(int i=1;i<=n;i++){
if(p[i]==i){
for(int j=vol;j>=v[i];j--)f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
printf("%d",f[vol]);
return 0;
}