1. 程式人生 > >P1455 搭配購買 (並查集+01背包)

P1455 搭配購買 (並查集+01背包)

的人 clas () 一朵 一個 return ++ turn printf

【題目描述】

    明天就是母親節了,電腦組的小朋友們在忙碌的課業之余挖空心思想著該送什麽禮物來表達自己的心意呢?聽說在某個網站上有賣雲朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店裏有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\n",dp[w]); 29 return 0; 30 }

P1455 搭配購買 (並查集+01背包)