zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Maven安装及配置
    Java部分概念理解
    API.day01
    随机生成10元素数组并找出最大元素(Java)
    冒泡排序(Java)
    俄罗斯方块部分功能(Java)
    判断闰年(Java)
    判断质数(Java)
    基于DSP的IS95正向业务信道模块设计
    Lua程序设计(4th) 第一部分 语言基础
  • 原文地址:https://www.cnblogs.com/Willendless/p/9457134.html
Copyright © 2011-2022 走看看