本题考点:并查集 背包
并查集
查询 find函数
return x == f[x] ? x : f[x] = find(f[x]);
合并 merge函数
int fx = find(x);
int fy = find(y);
if (fx != fy)
f[fx] = fy;
背包
状态转移方程 dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
for (int j = maxn; j >= w[i]; j--) dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
整体思路
1.输入和数组
2.每次输入、,合并
3.定义一个根,查找
if(f[i]!=i){
root=find(i);
w[root]+=w[i];
v[root]+=v[i];
w[i]=0;
v[i]=0;
}
4.状态转移填数组
if(w[i]==0&&v[i]==0)continue;
for(int j=maxn;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
5.输出