• 洛谷P1455 搭配购买


    题目描述

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

    分析:其实就是把多个物品变成1个物品,然后做0-1背包,问题就是怎么缩点,这是个无向图,一般就用并查集缩点,当然,也可以dfs.

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    int n,m,w,fa[10010],v1[10010],c1[10010],cnt,v[10010],p[10010],f[10010];
    
    int find(int x)
    {
        if (x == fa[x])
        return x;
        return fa[x] = find(fa[x]);
    }
    
    void hebing(int x,int y)
    {
        int fx = find(x),fy = find(y);
        if (fx != fy)
        {
            fa[fx] = fy;
            v1[fy] += v1[fx];
            c1[fy] += c1[fx];
        }
    }
    
    int main()
    {
        scanf("%d%d%d",&n,&m,&w);
        for (int i = 1; i <= n; i++)
        fa[i] = i;
        for (int i = 1; i <= n; i++)
        scanf("%d%d",&v1[i],&c1[i]);
        for (int i = 1; i <= m; i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            hebing(u,v);
        }
        for (int i = 1; i <= n; i++)
        if (fa[i] == i)
        {
            v[++cnt] = v1[i];
            p[cnt] = c1[i];
        }
        for (int i = 1; i <= cnt; i++)
        for (int j = w; j >= v[i]; j--)
        f[j] = max(f[j],f[j - v[i]] + p[i]);
        printf("%d
    ",f[w]);
        
        return 0;
    }
  • 相关阅读:
    ps基础磨皮(混入了奇怪的博客~)
    spring boot配置ssl
    Chrome自动翻译失效的解决办法
    小红书数美滑块验证码
    使用DataLoader报错AttributeError: 'int' object has no attribute 'numel'
    glidedsky-爬虫-验证码-1
    glidedsky-爬虫-雪碧图-2
    glidedsky-爬虫-雪碧图-1
    glidedsky-爬虫-CSS反爬
    glidedsky-爬虫-字体反爬-1
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7499252.html
Copyright © 2020-2023  润新知