搭配購買
阿新 • • 發佈:2017-08-10
using bit clu ans span spa cin ace out
洛谷P1455 搭配購買
把需要一起購買的物品放到並查集裏,每一個並查集的標誌是根節點,把v和w都累加,然後對根節點做01背包。
#include<bits/stdc++.h> using namespace std; int dad[10001],f[10001],v[10001],bag,w[10001]; int n,m; int ans; int getfather(int x) { if(dad[x]==x) return x; dad[x]=getfather(dad[x]); return dad[x]; } int main() { cin>>n>>m>>bag;for(int i=1;i<=n;i++) dad[i]=i; for(int i=1;i<=n;i++) cin>>w[i]>>v[i]; int x,y; while(m--) { cin>>x>>y; int gx=getfather(x),gy=getfather(y); if(gx!=gy) { dad[gx]=gy; v[gy]+=v[gx]; w[gy]+=w[gx]; } } for(int i=1;i<=n;i++) { if(getfather(i)==i) for(int j=bag;j>=w[i];j--) f[j]=max(f[j],f[j-w[i]]+v[i]); } cout<<f[bag]; return 0; }
搭配購買