【题目描述】
明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经被老板编号为1,2,3,……,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。
【题目链接】
https://www.luogu.org/problemnew/show/P1455
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct info{ int m,v; }h[10010],s[10010],b[10010]; 4 int n,m,w,tot; 5 int fa[10010],dp[10010]; 6 int Get(int x) 7 { 8 if(x==fa[x]) return x; 9 return fa[x]=Get(fa[x]); 10 } 11 void Merge(int x,int y) 12 { 13 fa[Get(x)]=Get(y); 14 } 15 int main() 16 { 17 scanf("%d%d%d",&n,&m,&w); 18 for(int i=1;i<=n;i++) scanf("%d%d",&h[i].m,&h[i].v),fa[i]=i; 19 for(int i=1;i<=m;i++) { 20 int a,b; scanf("%d%d",&a,&b); 21 Merge(a,b); 22 } 23 for(int i=1;i<=n;i++) s[Get(i)].m+=h[i].m,s[Get(i)].v+=h[i].v; 24 for(int i=1;i<=n;i++) if(s[i].m) b[++tot].m=s[i].m,b[tot].v=s[i].v; 25 for(int i=1;i<=tot;i++) 26 for(int j=w;j>=b[i].m;j--) 27 dp[j]=max(dp[j],dp[j-b[i].m]+b[i].v); 28 printf("%d ",dp[w]); 29 return 0; 30 }