<aside> 💡 全称为:状态压缩 DP

</aside>

1. 通用解法思路

2. 必备技巧

2.1 整型转二进制字符串

// 可以根据 i 的范围调整 bitset 的大小
std::string int_to_bit_str(int i) {
    std::bitset<8> bits(i);
    return bits.to_string();
}

2.2 二进制表示下某个状态的子集

因为状压 DP 下,通常使用二进制来表示某些东西在某一时刻下的状态,然后需要根据这些状态,遍历它的所有子集,进行暴力搜索。

举例:

力扣

[LC 2305] 把 n 个饼干,分给 k 个孩子,我们定义 DP 为:

<aside> 💡 dp[i][j], i 是前 i 个孩子,j 是这些孩子可以分配的饼干的状态,范围为 0 ~ 2^n - 1

</aside>

假如有 3 个饼干,那么状态有: