商店里有n朵云,云朵被编号为i1,2,…,n
,并且每朵云都有一个价值。但一些云朵要搭配来买, 买一朵云则与这朵云有搭配的云都要买。
Joe的钱有限,希望买的价值最大
#include <iostream> #include <queue> #include <algorithm> using namespace std; const int N= 1e5+5; int n,m,V,cost[N],val[N],fa[N]; int f[N]; int find(int x){ if(x==fa[x]) return x; fa[x]=find(fa[x]); return fa[x]; } void uni(int x,int y){ int fx=find(x),fy=find(y); if(fx==fy) return ; fa[fx]=fy; cost[fy]+=cost[fx]; val[fy]+=val[fx]; } signed main(){ int i,j,x,y; cin>>n>>m>>V; for(i=1;i<=n;i++) cin>>cost[i]>>val[i]; for(i=1;i<=n;i++) fa[i]=i; for(i=1;i<=m;i++) cin>>x>>y,uni(x,y); for(i=1;i<=n;i++) if(fa[i]==i){ for(j=V;j>=cost[i];j--) f[j]=max(f[j],f[j-cost[i]]+val[i]); } cout<<f[V]; }