一、背包
「HNOI2007」梦幻岛宝珠
题目
将物品按照 b b b 分组,每组内部 dp,然后合并。
组内的 dp,就是设 g [ i ] [ j ] g[i][j] g[i][j] 第 i i i 组,选出 j × 2 i j\times2^i j×2i 的最大价值。
现在考虑如何合并,设 f [ i ] [ j ] f[i][j] f[i][j] 从高到低到 i i i 位, w w w 减去已选后还剩 j × 2 i j\times 2^i j×2i 的最大价值。
转移是 f [ i − 1 ] [ 2 × j + c − k ] ← f [ i ] [ j ] + g [ i − 1 ] [ k ] f[i-1][2\times j+c-k]\leftarrow f[i][j]+g[i-1][k] f[i−1][2×j+c−k]←f[i][j]+g[i−1][k]。需要注意的是,转移中的 2 × j + c − k 2\times j+c-k 2×j+c−k 要与 10 × n 10\times n 10×n 取 min,因为过大的值即使记录下来也对后续无影响。
「NOI2015」寿司晚宴
题目
首先考虑暴力。设 d p [ i ] [ S 1 ] [ S 2 ] dp[i][S_1][S_2] dp[i][S1][S2] 表示前 i i i 个数,两个人选择的质数集合分别是 S 1 S_1 S1, S 2 S_2 S2。转移就是 d p [ i + 1 ] [ S 1 ∣ k ] [ S 2 ] ← d p [ i ] [ S 1 ] [ S 2 ] dp[i+1][S_1|k][S_2]\leftarrow dp[i][S_1][S_2] dp[i+1][S1∣k][S2]←dp[i][S1][S2] 和 d p [ i + 1 ] [ S 1 ] [ S 2 ∣ k ] ← d p [ i ] [ S 1 ] [ S 2 ] dp[i+1][S_1][S_2|k]\leftarrow dp[i][S_1][S_2] dp[i+1][S1][S2∣k]←dp[i][S1][S2]。
n ≤ 500 n\le500 n≤500,一个数中大于 n \sqrt{n} n