分组背包,话说有很多的小姐姐,每个都有她们的体重和颜值,小姐姐们分成一个个团体,
现在让你来选,考虑到面子问题,每组小姐姐要么只能选一个要么全选,舞台能承受的重量是固定的。
先用并查集把输入的人分组,然后在放到vector<int > 中
#include <iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define N 1005
using namespace std;
int dp[N]={0},b[N],w[N],f[N];
int Find(int x)
{
while(f[x]!=x)
x=f[x];
return x;
}
void Union(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
{
f[fx]=fy;
}
}
int main()
{
int n,m,W;
cin>>n>>m>>W;
for(int i=1;i<=n;i++)
cin>>w[i];
for(int i=1;i<=n;i++)
cin>>b[i];
int x,y;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=0;i<m;i++)
{
cin>>x>>y;
Union(x,y);
}
vector<int >S[N];
for(int i=1;i<=n;i++)
S[Find(i)].push_back(i);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
if(Find(i)!=i)
continue;
for(int j=W;j>=0;j--)
{
int sum1=0,sum2=0;
for(int k=0;k<S[i].size();k++)
{
sum1+=w[S[i][k]];
sum2+=b[S[i][k]];
if(j>=w[S[i][k]])
{
dp[j]=max(dp[j],dp[j-w[S[i][k]]]+ b[S[i][k]]);
}
}
if(j>=sum1)
{
dp[j]=max(dp[j],dp[j-sum1]+sum2);
}
}
}
cout<<dp[W]<<endl;
}
然后就是一个01背包的题目