C129 並查集+01揹包 P1455 搭配購買

董晓發表於2024-05-28

影片連結: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];
}

相關文章