社区讨论

【依旧必关】过了之后的疑问(违规自删)

P1455搭配购买参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mlnnft4x
此快照首次捕获于
2026/02/15 19:15
4 天前
此快照最后确认于
2026/02/15 19:22
4 天前
查看原帖

60pts60\mathrm{pts} 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 条回复,欢迎继续交流。

正在加载回复...