Solution:<洛谷>1455搭配购买
此题非常简单,物品之间有依赖关系,而且依赖是双向的,那就好办了。先用并查集将有依赖的物品添加到一个集合里面去,然后再更新集合的价值和价格。再搞个并查集上去完事。下面上代码。
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int n,m,v;
int w[N],val[N];
int rel[N],f[N];
int find(int x)
{
if(rel[x]!=x)
{
rel[x]=find(rel[x]);
}
return rel[x];
}
int muilt_num(int x,int y)
{
rel[x]=y;
}
void init()
{
cin >> n >> m >> v;
for ( int i=1;i<=n;i++ )
{
cin >> w[i] >> val[i];
}
for ( int i=1;i<=n;i++ )
{
rel[i] = i;
}
for ( int i=1;i<=m;i++ )
{
int x,y;
cin >> x >> y;
int x1,y1;
x1 = find(x);
y1 = find(y);
if(x1!=y1)
{
muilt_num(x1,y1);
}
}
for(int i=1;i<=n;i++)
{
if(rel[i]!=i)
{
w[find(i)]+=w[i];
val[find(i)]+=val[i];
w[i]=val[i]=0;
}
}//如果不是自己的集合,就更新
}
int zerone_pack()
{
for ( int i=1;i<=n;i++ )
{
for(int j=v;j>=w[i];j--)
{
f[j]=max(f[j],f[j-w[i]]+val[i]);
}
}
cout << f[v];
}
int main()
{
init();
zerone_pack();
return 0;
}