码迷,mamicode.com
首页 > 其他好文 > 详细

P1455 搭配购买 (并查集+01背包)

时间:2018-08-10 23:22:04      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:tps   div   是你   有一个   并且   max   inf   style   void   

【题目描述】

    明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有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背包)

标签:tps   div   是你   有一个   并且   max   inf   style   void   

原文地址:https://www.cnblogs.com/Willendless/p/9457134.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!