专栏文章
题解: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 可通过。很模板的题,评蓝虚高。设 表示考虑前 个题目,得到恰好 分是否可行。转移:。
CPPconst 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 条评论,欢迎与作者交流。
正在加载评论...