• 搭配购买


    题目描述

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

    输入输出格式

    输入格式:

    第1行n,m,w,表示n朵云,m个搭配和你现有的钱的数目

    第2行至n+1行,每行ci,di表示i朵云的价钱和价值

    第n+2至n+1+m ,每行ui,vi表示买ui就必须买vi,同理,如果买vi就必须买ui

    输出格式:

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

    输入输出样例

    输入样例#1:
    5 3 10
    3 10
    3 10
    3 10
    5 100
    10 1
    1 3
    3 2
    4 2
    
    
    输出样例#1:
    1
    

    说明

    30%的数据满足:n<=100

    50%的数据满足:n<=1000;m<=100;w<=1000;

    100%的数据满足:n<=10000;0<=m<=5000;w<=10000.

    分析:

    本题比较简单,就是把必须要买的合并在一起,然后一起求和。

    CODE:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int fa[10005];
     6 int cost[10005],val[10005];
     7 int c[10005],v[10005];
     8 int n,m,w;
     9 int f[10005];
    10 int findr(int x){
    11     if (fa[x]==x) return x;
    12     return fa[x]=findr(fa[x]);
    13 }
    14 int merge(int a,int b){
    15     int A=findr(a);
    16     int B=findr(b);
    17     if (A!=B)
    18     fa[B]=A;
    19 }
    20 int main(){
    21     cin>>n>>m>>w;
    22     for (int i=1;i<=n;i++){
    23         cin>>cost[i]>>val[i];
    24         c[i]=cost[i],v[i]=val[i];
    25         fa[i]=i;
    26     }
    27     for (int i=1;i<=m;i++){
    28         int x,y;
    29         cin>>x>>y;
    30         merge(x,y);
    31     }
    32     for (int i=1;i<=n;i++){
    33         if (fa[i]!=i){
    34         c[findr(i)]+=c[i];
    35         v[findr(i)]+=v[i];
    36         c[i]=v[i]=0;
    37         }
    38         //cout<<fa[i]<<endl;
    39     }
    40     /*for (int i=1;i<=n;i++)
    41     cout<<c[i]<<" "<<v[i]<<endl;*/
    42     for (int i=1;i<=n;i++){
    43         for (int j=w;j>=c[i];j--){
    44         f[j]=max(f[j],f[j-c[i]]+v[i]);
    45         }
    46     }
    47     cout<<f[w];
    48     //system("pause");
    49     return 0;
    50 }
  • 相关阅读:
    UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
    UVa 1658 (拆点法 最小费用流) Admiral
    UVa 11082 (网络流建模) Matrix Decompressing
    UVa 753 (二分图最大匹配) A Plug for UNIX
    UVa 1451 (数形结合 单调栈) Average
    UVa 1471 (LIS变形) Defense Lines
    UVa 11572 (滑动窗口) Unique Snowflakes
    UVa 1606 (极角排序) Amphiphilic Carbon Molecules
    UVa 11054 Wine trading in Gergovia
    UVa 140 (枚举排列) Bandwidth
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11139288.html
Copyright © 2020-2023  润新知