专栏文章

题解:P11703 [ROIR 2025] 个人 OI 比赛的原则

P11703题解参与者 1已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@miq8rc7q
此快照首次捕获于
2025/12/04 00:48
3 个月前
此快照最后确认于
2025/12/04 00:48
3 个月前
查看原文
01 背包板子+DFS 拼凑目标值。用 bitset 可通过。很模板的题,评蓝虚高。
dpi,j=0/1dp_{i,j}=0/1 表示考虑前 ii 个题目,得到恰好 jj 分是否可行。转移:dpi,j=dpi,jkdpi1,jkdp_{i,j}=dp_{i,j-k}\lor dp_{i-1,j-k}
CPP
const ll N = 1e5 + 10, GOAL = 1e5 + 10;
ll n, goal;
bitset<GOAL> dp[N];
vector<ll> v[N], ans[N];

void dfs(ll p, ll rem, ll lst) {
	if (p == 0) {
		if (rem == 0) {
			rep(i, 1, n) {
				cout << ans[i].size() << '\n';

				for (ll j : ans[i])
					cout << j + 1 << ' ';

				endl;
			}

			exit(0);
		}
	} else {
		if (lst + 1 <= v[p].size() - 1) {
			rep(i, lst + 1, v[p].size() - 1) {
				if (rem >= v[p][i] and dp[p][rem - v[p][i]]) {
					ans[p].pb(i);
					dfs(p, rem - v[p][i], i);
					ans[p].pop_back();
				}

				if (rem >= v[p][i] and dp[p - 1][rem - v[p][i]]) {
					ans[p].pb(i);
					dfs(p - 1, rem - v[p][i], -1);
					ans[p].pop_back();
				}
			}
		}
	}
}

int main() {
	cin >> n >> goal;

	rep(i, 1, n) {
		ll m;
		cin >> m;

		count(m) {
			ll in;
			cin >> in;
			v[i].pb(in);
		}
	}

	dp[0][0] = 1;

	rep(i, 1, n) {
		for (ll j : v[i]) {
			rep_(k, goal, j) dp[i][k] = dp[i][k] or dp[i][k - j] or dp[i - 1][k - j];
		}
	}

	if (dp[n][goal]) {
		cout << "Yes\n";
		dfs(n, goal, -1);
	} else
		cout << "No";
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...