「题解」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\)(?)

posted @ 2023-05-27 10:35  Network_Error  阅读(29)  评论(0)    收藏  举报