「题解」Ucup #10 浙江 K. Knapsack Problem(背包套数位 DP)
描述

思路
可以看作 \(k\) 个背包,每个物品对二进制位为 1 所在的背包产生贡献。
如果背包大小比较小,可以直接背包 DP。
现在 \(a_i\) 比较大,可以考虑按数位最低到高 填写每个 \(x_i\)。
设 \(f_{i,j,k}\) 表示正在填第 \(i\) 位,已经填完了前 \(j-1\) 个物品,每个背包后 \(i-1\) 位的进位的集合为 \(k=\{k_1,k_2,k_3,k_4\}\)。
有 \(0\le j_i\le 7+8\),因为每个背包拥有的物品数 \(\le 8\),从 \(i-1\) 进来的 \(7\),加上当前这一位进来的 \(8\)。
这样仍然不足以通过。
考虑三件物品 \(x_1,x_2,x_3\),此时让 \(x_1,x_2\) 减去 \(1\),\(x_3\) 加上 \(1\),或相反,必然会使 \(x_1,x_2,x_3\) 中一个为 \(0\),而答案不劣。
爆搜可以得出每种方案,一定存在最优解使得最多只有 \(5\) 个不为空,这样 \(j_i\) 可以优化到 \(9\),复杂度 \(\mathcal{O}(2^k 10^k \log W )\)。
其实 \(j_i\) 还可以优化到 \(7\)(?)

浙公网安备 33010602011771号