P1455 搭配购买 (并查集+01背包)
Posted willendless
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1455 搭配购买 (并查集+01背包)相关的知识,希望对你有一定的参考价值。
【题目描述】
明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有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 }
以上是关于P1455 搭配购买 (并查集+01背包)的主要内容,如果未能解决你的问题,请参考以下文章