洛谷P3052题解
看起来非常简单,但是细节多的一批的状压DP入门题。
我设 \(f_i\) 为 \(i\) 状态时最小分组数, \(g_i\) 为 \(i\) 状态时最后一组剩余空间。
对于每一个 \(i\) ,枚举每一个 \(1\le j\le n\) 且 \(j\) 不在 \(i\) 内, 即 \(i \& (1<<(j-1))=0\) 。然后分类讨论:
- \(j\) 可以放在最后一组中, \(f_{i | (1<< (j-1))}=\operatorname{min}\{f_{i | (1<< (j-1))},f_i\}, g_{i | (1<< (j-1))}=\operatorname{max}\{g_{i | (1<< (j-1))},g_i-a_j\}\) 。
- \(j\) 不能放在最后一组中, \(f_{i | (1<< (j-1))}=\operatorname{min}\{f_{i | (1<< (j-1))},f_i+1\}, g_{i | (1<< (j-1))}=\operatorname{max}\{g_{i | (1<< (j-1))},W-a_j\}\) 。
初始状态:\(f_0=1,g_0=W\),就是开一个空的组。其他的 \(f_i\) 赋 INF
。
答案就是 \(f_{(1<<n)-1}\) 。
代码