AcWing 1252. 搭配购买(并查集、01背包)

题目链接:点击这里

在这里插入图片描述
在这里插入图片描述

将每个物品的体积和价值绑定到根节点上,所有的根节点可以看成是01背包问题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 10010;

int n, m, vol;
int f[N];
int v[N], w[N];
int dp[N];

int find(int x)
{
    if(f[x] != x)   f[x] = find(f[x]);
    return f[x];
}

int main()
{
    scanf("%d%d%d", &n, &m, &vol);
    
    for(int i = 1; i <= n; ++i) f[i] = i;
    
    for(int i = 1; i <= n; ++i) scanf("%d%d", &v[i], &w[i]);
    
    for(int i = 1; i <= m; ++i)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        int fa = find(a), fb = find(b);
        if(fa != fb)
        {
            v[fb] += v[fa];
            w[fb] += w[fa];
            f[fa] = fb;
        }
    }
    
    for(int i = 1; i <= n; ++i)
    {
        if(f[i] == i)
        {
            for(int j = vol; j >= v[i]; j--)
            {
                dp[j] = max(dp[j], dp[j-v[i]] + w[i]);
                
            }
        }
    }
    
    printf("%d\n", dp[vol]);
    
    return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/105147371