社区讨论
【依旧必关】过了之后的疑问(违规自删)
P1455搭配购买参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mlnnft4x
- 此快照首次捕获于
- 2026/02/15 19:15 4 天前
- 此快照最后确认于
- 2026/02/15 19:22 4 天前
Code
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 5;
int n, m, w, c[N], d[N], fa[N], dp[N];
int real01w[N], real01v[N], cnt; bool vis[N];
unordered_map<int, int> real01;
int find(int x) {
return (fa[x] == x ? x : fa[x] = find(fa[x]));
}
void Merge(int x, int y) {
int fx = find(x);
int fy = find(y);
if (fx != fy) {
fa[fy] = fx;
}
}
int main() {
ios::sync_with_stdio(false);
cin >> n >> m >> w;
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
for (int i = 1; i <= n; i++) {
cin >> c[i] >> d[i];
}
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
Merge(u, v);
}
for (int i = 1; i <= n; i++) {
int fi = find(i);
if (!vis[fi]) {
vis[fi] = 1;
real01w[++cnt] = c[i];
real01v[cnt] = d[i];
real01.insert({fi, cnt});
}
else {
int go = real01[fi];
real01w[go] += c[i];
real01v[go] += d[i];
}
}
// for (int i = 1; i <= cnt; i++) dp[i] = INT_MIN;
for (int i = 1; i <= cnt; i++) {
for (int j = w; j >= real01w[i]; j--) {
dp[j] = max(dp[j], dp[j - real01w[i]] + real01v[i]);
}
}
cout << dp[w];
return 0;
}
如你所见,把这个N改成10005之后就过了,不改就60。。。请问为什么?必关
wgzs
回复
共 3 条回复,欢迎继续交流。
正在加载回复...