题意 : 有n个人,每个人都有颜值bi与体重wi。剧场的容量为W。有m条关系,xi与yi表示xi和yi是好朋友,在一个小组。 每个小组要么全部参加舞会,要么参加人数不能超过1人。 问保证总重量不超过W,剧场中的颜值最大能到多少?

分析 : 很显然的分组背包题目, 不过有所不同, 先来回顾一下普通的分组背包的描述 给出一个背包,背包有容量C,再给出N组物品,每组物品有ki种,每种物品有对应的体积Vi,价值Pi,每组物品至多选一种,且最多取一件。求用背包装物品,能获得的最大总价值是多少。可以发现和上面的不同之处就是多了一个可以全取的操作, 其实只要再在每一组里面加上所有的物品和就行了, 便成了一道普通的模板题了!在分组的时候使用简单的并查集即可!

瞎搞 : 在实现的时候很慢, 还老是犯小错误, 归其原因就是分组背包接触太少, 即使是模板题也写的有点不流利!

#include<bits/stdc++.h>
using namespace std;
struct st
{
    int w, v, id;
};
st arr[];
][], w[][], dp[], p[];///p数组表示各个组里面的物品个数
], sumw[];
];
map<int, int> M;
int findset(int x)
{
    int root = x;
    while(c[root] != root) root = c[root];
    int j;
    while(c[x] != root){
        j = c[x];
        c[x] = root;
        x = j;
    }
    return root;
}
inline int join(int a, int b)
{
    int f = findset(a), ff = findset(b);
    if(f != ff){
        c[f] = ff;
    }
}
#define IN 0
#define OUT 0
int main(void)
{
    #if IN
        freopen("in.txt", "r", stdin);
    #endif
    #if OUT
        freopen("out.txt", "w", stdout);
    #endif
    int n, m, C;
    scanf("%d%d%d", &n, &m, &C);
    M.clear();
    ; i<=n; i++){
        memset(v[i], , sizeof(v[i]));
        memset(w[i], , sizeof(w[i]));
        memset(p, , sizeof(p));
        memset(dp, , sizeof(dp));
        memset(sumw, , sizeof(sumw));
        memset(sumv, , sizeof(sumv));
        arr[i].id = i;//忽略这个id, 没有用, 懒得改了.....
        c[i] = i;
    }
    ; i<=n; i++) scanf("%d", &arr[i].w);
    ; i<=n; i++) scanf("%d", &arr[i].v);
    ; i<m; i++){
        int a, b;
        scanf("%d%d", &a, &b);
        join(a, b);
    }
    ;///表示组数
    ];
    memset(vis, true, sizeof(vis));
    ; i<=n; i++){
        int temp = findset(i);
        if(vis[temp]){///如果还没有出现过这个在并查集里面的“大佬”
            M[temp] = top;//记录一下老大所在的组的下标元素
            vis[temp] = false;
            v[top][p[top]] = arr[i].v;
            w[top][p[top]] = arr[i].w;
            sumv[top] += arr[i].v;
            sumw[top] += arr[i].w;
            p[top]++, top++;
        }else{
            int Top = M[temp];
            v[Top][p[Top]] = arr[i].v;
            w[Top][p[Top]] = arr[i].w;
            sumv[Top] += arr[i].v;
            sumw[Top] += arr[i].w;
            p[Top]++;
        }
    }
    ; i<top; i++){
        ) continue;//这里需要注意, 只有一个元素的时候, 不应该再加所有元素的和, 会重复的!
        v[i][p[i]] = sumv[i];
        w[i][p[i]] = sumw[i];
        p[i]++;
    }
///Debug begin
//    printf("top = %d\n", top);
//    for(int i=0; i<top; i++){
//        printf("In group %d\n", i);
//        printf("v");puts("");
//        for(int j=0; j<p[i]; j++){
//            printf("ord=%d, v=%d\n", j, v[i][j]);
//        }
//        printf("w");puts("");
//        for(int j=0; j<p[i]; j++){
//            printf("ord=%d, w=%d\n", j, w[i][j]);
//        }
//        puts("");
//    }
//    puts("");
///Debug end
    ; i<top; i++){
        ; j--){
            ; k<p[i]; k++){
                if(w[i][k] <= j)
                dp[j] = max(dp[j], dp[j-w[i][k]]+v[i][k]);
            }
        }
///Debug begin
//        for(int ii=1; ii<=C; ii++){
//            printf("%d ", dp[ii]);
//        }
//        puts("");
///Debug end
    }
    printf("%d\n", dp[C]);
    ;
}

#383 Div1 Problem B Arpa's weak amphitheater.... (分组背包 && 并查集)的更多相关文章

  1. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(分组背包+dsu)

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses Problem Description: Mehrdad wants to invit ...

  2. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses —— DP(01背包)

    题目链接:http://codeforces.com/contest/742/problem/D D. Arpa's weak amphitheater and Mehrdad's valuable ...

  3. Codeforces Round #383 (Div. 2)D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(dp背包+并查集)

    题目链接 :http://codeforces.com/contest/742/problem/D 题意:给你n个女人的信息重量w和美丽度b,再给你m个关系,要求邀请的女人总重量不超过w 而且如果邀请 ...

  4. Arpa's weak amphitheater and Mehrdad's valuable Hoses

    Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit per ...

  5. B. Arpa's weak amphitheater and Mehrdad's valuable Hoses

    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ...

  6. Codeforces 741B:Arpa's weak amphitheater and Mehrdad's valuable Hoses(01背包+并查集)

    http://codeforces.com/contest/741/problem/B 题意:有 n 个人,每个人有一个花费 w[i] 和价值 b[i],给出 m 条边,代表第 i 和 j 个人是一个 ...

  7. Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses

    [题目链接] http://codeforces.com/problemset/problem/741/B [题目大意] 给出一张图,所有连通块构成分组,每个点有价值和代价, 要么选择整个连通块,要么 ...

  8. D. Arpa's weak amphitheater and Mehrdad's valuable Hoses 分组背包模板题

    http://codeforces.com/problemset/problem/742/D 并查集预处理出所有关系. 一开始的时候,我预处理所有关系后,然后选择全部的时候,另起了一个for,然后再判 ...

  9. 【42.86%】【codeforces 742D】Arpa's weak amphitheater and Mehrdad's valuable Hoses

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

随机推荐

  1. 【嵌入式开发】Raspberry Pi 树莓派性能测试

    Raspberry Pi 树莓派性能测试 目录: CPU Linpack基准测试 源码 编译/运行 结果 Whetstone/Dhrystone综合基准测试 源码 编译/运行 结果 OpenSSL安全 ...

  2. sql回显注入-笔记

     拼接sql命令查询数据   注释 常用于sql注入            # 井号 单行注释 注意:URL编码 %23          -- 两个减号加空格 单行注释           /*   ...

  3. AES ------ 第三方库

    tiny-AES-c-master.zip 这个库可用

  4. etcd单节点数据备份与恢复

    插入测试数据 # etcdctl put smith # etcdctl put allen # etcdctl put ward # etcdctl put jones # etcdctl put ...

  5. picgo+typora优化markdown体验

    picgo+typora优化markdown体验 写markdown的时候许多图片的存放的上传是一个大问题,之前一直都是使用先截图,在commit之后,再将线上图片地址粘贴到相应的位置 现在知道了pi ...

  6. solve update pip 10.0.0

    The bug is found in pip 10.0.0. In linux you need to modify file: /usr/bin/pip from: from pip import ...

  7. qt tableview里面添加控件

    在QStyledItemDelegate的paint方法里面 void MyItemModelDeletage::paint(QPainter *painter, const QStyleOption ...

  8. JavaSE基础:泛型

    泛型 1.引入 情景模式描述,假设完成一个学生的成绩的情况: 整数: math=80,english=70 小数: math=85.6,englisth=77.8 字符串: math="66 ...

  9. nacos集群搭建

    nacos介绍 Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心).动态配置服务(可以做配置中心).动态 DNS 服务. 1.从官网下载nacos压缩 ...

  10. DNS域名工作原理及解析

    0x00 定义 DNS( Domain Name System)是“域名系统”的英文缩写,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP端口53 ...