正题
题目链接:
https://www.luogu.org/problemnew/show/P1455
大意
有n个商品,给出价值和价格。有m组搭配,如果买了其中一个就得买另一个,给出你拥有的钱,求能获得的最大价值
解题思路
首先用并查集算出每个搭配的价格和价值,然后一遍01背包
代码
#include<cstdio>
#include<iostream>
using namespace std;
int f[10001],father[10001],c[10001],w[10001];
int n,m,t,x,y;
int find(int x)
{
if (x!=father[x]) return father[x]=find(father[x]);
return father[x];
}
void unionn(int x,int y)
{
int fa=find(x),fb=find(y);
if (fa<fb)
{
father[fb]=fa;
c[fa]+=c[fb];
w[fa]+=w[fb];//计算价格
}
else
{
father[fa]=fb;
c[fb]+=c[fa];
w[fb]+=w[fa];
}
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&w[i],&c[i]);
father[i]=i;
}
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
unionn(x,y);
}
for (int i=1;i<=n;i++)
{
if (father[i]==i)
{
for (int j=t;j>=w[i];j--)
{
f[j]=max(f[j],f[j-w[i]]+c[i]);
}
}
}//01背包
printf("%d",f[t]);
}