题意 : 有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. es5实现数组去重

    var a = [1, 2, 4, 4, 3, 3, 1, 5, 3] console.log(a.filter((item, index, arr) => { return arr.index ...

  2. python logger理解

    import logging#进行基本的日志配置 logging.basicConfig(filename = 'access.log',format = '%(asctime)s - %(name) ...

  3. linux shutdown 命令 关机 重启

    关机 shutdown -h now 重启 shutdown -r now

  4. 面试宝典:25个最经典的JavaScript面试题及答案

    1.使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱? 尽管 typeof bar === "objec ...

  5. awk对文件的奇偶行做处理

    { if(NR % 2 == 0) printf("%s\n", $0) else printf("%s, ", $1) } awk -f awk.awk da ...

  6. ubuntu 安装 CUDA、 cuDNN 的tips

    CUDA 查看驱动兼容性:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html 查看GCC 与CUDA 驱动版本的兼容性 ...

  7. sqlalchemy query函数可用参数有哪些?

    一.模型名 二.模型对象属性 三.聚合函数 下面就分别为大家讲讲query函数这三种参数的用法. 在讲之前,我已经把数据库连接配置.模型,以及添加数据写好了,代码如下: from sqlalchemy ...

  8. leetcode 75. Sort Colors (荷兰三色旗问题)

    Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...

  9. 安装linux mint后要做20件事

    Linux Mint 17 Qiana Cinnamon Linux Mint 17已经发布,定名为Qiana.Mint是Linux最佳发行版之一,它定位于桌面用户,关注可用性和简洁.它携带了风格迥异 ...

  10. Python 常用库(随时补充)

    1. Python-RSA使用手册 英文文档见Python-RSA使用手册,主要介绍了Python-RSA的消息的加密解密.文件的加密解密以及签名的方法. Installation 使用pip ins ...