C129 并查集+01背包 P1455 搭配购买

视频链接:C129 并查集+01背包 P1455 搭配购买_哔哩哔哩_bilibili

 

 

E08【模板】背包DP 01背包_哔哩哔哩_bilibili

P1455 搭配购买 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 并查集+01背包
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=10005;
int n,m,V;
int p[N];
int v[N],w[N],f[N];

int find(int x){
  return p[x]==x?x:p[x]=find(p[x]);
}
int main(){
  ios::sync_with_stdio(0);
  cin>>n>>m>>V;
  for(int i=1;i<=n;i++){ //n个物品
    cin>>v[i]>>w[i]; //体积和价值
    p[i]=i;
  }
  for(int i=1;i<=m;i++){ //m个搭配
    int x,y;cin>>x>>y;
    x=find(x),y=find(y);
    if(x!=y){
      p[x]=y;
      v[y]+=v[x]; //捆绑的体积
      w[y]+=w[x]; //捆绑的价值
    }
  }
  for(int i=1;i<=n;i++) //物品
    if(p[i]==i) //物品为根
      for(int j=V;j>=v[i];j--) //体积
        f[j]=max(f[j],f[j-v[i]]+w[i]);
  cout<<f[V];
}

 

posted @ 2024-05-28 12:46  董晓  阅读(217)  评论(0)    收藏  举报