题目链接:点击这里
将每个物品的体积和价值绑定到根节点上,所有的根节点可以看成是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;
}