zoukankan      html  css  js  c++  java
  • P1455 搭配购买

    P1455 搭配购买

    题目描述

    明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有 n 朵云,云朵已经被老板编号为1,2,3,...,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。

    输入格式

    第一行输入三个整数,n,m,w表示有 n 朵云,m 个搭配和你现有的钱的数目。

    第二行至 n+1 行,每行有两个整数,c,d,表示第 i 朵云的价钱和价值。

    第 n+2至 n+1+m行 ,每行有两个整数u,v。表示买第 u朵云就必须买第 v 朵云,同理,如果买第 v 朵就必须买第u朵。

    输出格式

    一行,表示可以获得的最大价值。

    输入输出样例

    输入 #1

    5 3 10
    3 10
    3 10
    3 10
    5 100
    10 1
    1 3
    3 2
    4 2

    输出 #1

    1    

     

    代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n,m,w,u,v,c[10005],d[10005],f[10005],pre[10005];
    int find(int x)//找爸爸+压缩路径
    {
        if(pre[x]==0)return x;
        return pre[x]=find(pre[x]);
    }
    void bcj(int x,int y)//并查集
    {
        int x1=find(x),y1=find(y);//先找爸爸
        if(x1!=y1)//不一样就合并
        {
            pre[y1]=x1;//合并
            c[x1]+=c[y1];//累加
            d[x1]+=d[y1];
            c[y1]=0;//记得清零(不然会干扰到01背包)
            d[y1]=0;
        }
    }
    int main()
    {
        cin>>n>>m>>w;
        for(int i=1;i<=n;i++)
         cin>>c[i]>>d[i];
        for(int i=1;i<=m;i++) 
        {
            cin>>u>>v;
            bcj(u,v);//并查集
        }
        for(int i=1;i<=n;i++)//01背包
         if(c[i]!=0)
          for(int j=w;j>=c[i];j--)
           f[j]=max(f[j],f[j-c[i]]+d[i]);
        cout<<f[w];   
        return 0;
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13715188.html

  • 相关阅读:
    Microsoft.mshtml到底是什么?
    编译.NET程序自动产生版本号的规则
    VB.NET(2005)中关于dll调用的错误信息(转)
    C# RichTextBox控件 滚动条 自动移至 最后一条记录处
    如何刪除richtextbox最後一行
    Using Hudson for C++/CMake/CppUnit
    让开发自动化: 选择持续集成服务器
    C#加载窗体错误
    各种CI工具对比表
    用 Hudson 实现 Visual Studio (C++) 项目的 daily build
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13715188.html
Copyright © 2011-2022 走看看