搭配购买

it2024-10-29  7

并查集+01背包

#include<bits/stdc++.h> using namespace std; typedef pair<int,int> PII; const int N = 1e4+10; int fa[N],value[N],cost[N],dp[N]; int n,m,w; set<PII> s; int find(int x) { if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } int main() { for(int i=0;i<N;i++) fa[i]=i; cin>>n>>m>>w; for(int i=1;i<=n;i++) cin>>cost[i]>>value[i]; int a,b; for(int i=0;i<m;i++) { cin>>a>>b; int faa=find(a),fbb=find(b); if(faa!=fbb) { fa[faa]=fbb; cost[fbb]+=cost[faa]; value[fbb]+=value[faa]; } } //01背包默写 for(int i=1;i<=n;i++) { if(fa[i]==i) { for(int j=w;j>=cost[i];j--) { dp[j]=max(dp[j],dp[j-cost[i]]+value[i]); } } } cout<<dp[w]; return 0; }
最新回复(0)