洛谷P8687题解

本题考虑使用状压 DP。

设糖果口味总数为 mm,使用二进制数 s{0,1}ms \in \{0, 1\}^m 表示口味集合,其中第 kk 位为 11 当且仅当该集合包含第 kk 种口味。

定义状态 f(s)f(s) 为覆盖口味集合 ss 所需的最小糖果包数。初始条件为:

  • f()=0f(\emptyset) = 0(空集不需要任何糖果包)

  • f(s)=+f(s) = +\infty(对于所有非空集合 ss

状态转移方程:

对于每包糖果的口味集合 aia_i1in1 \leq i \leq n),遍历所有可能的状态 ss,更新:

f(sai)=min(f(sai),f(s)+1)f(s \cup a_i) = \min(f(s \cup a_i), f(s) + 1)

可以得到如下代码:

1
2
3
4
5
6
7
8
memset(f, 0x3f3f3f3f, sizeof(f));
f[0] = 0;
for (int i = 0; i < n; i++) {
for (int s = 0; s < 1 << m; s++) {
if (f[s] > 105) continue;
f[s | a[i]] = min(f[s | a[i]], f[s] + 1);
}
}

完整代码就不给了,希望这篇题解对你有所帮助。


洛谷P8687题解
https://lijingshu2014.github.io/2025/10/03/洛谷P8687题解/
作者
lijingshu
发布于
2025年10月3日
许可协议