CF1428G2 Lucky Numbers (Hard Version) 解题报告

CF1428G2 Lucky Numbers (Hard Version) 解题报告

非常棒的一个背包 dp 题目。

需要一些观察和注意,然后转化成普通的多重背包。

第一个观察:可以发现,\(0\) 也可以作为幸运数字。

第二个观察:改变两个数字相同位置上的数,只要这个数位上的和不变,对答案没有任何影响。

有了这两个观察之后,我们发现,对于所有数的同一个数位,最多只会有一个非幸运数字的数。如果有两个 \(a,b\) 都不是幸运数字,我们可以通过调整让他变成一个是幸运数字,一个不是。

调整方法是这样的:

  1. 如果 \(a+b>9\),让一个变成 \(9\),另一个变成 \(a+b-9\),即可。
  2. 否则,让一个变成 \(0\),另一个变成 \(a+b\) 就行。

之后,我们可以通过交换两个数的同一个数位,把所有非幸运数字的全部叠到一个数上。

所以我们得到 一个结论

我们可以构造出一种有 \(k-1\) 个数每个数位都是由 \(0,3,6,9\) 组成的,有一个数是平凡的方案使得它的幸运值是最大的,也就是这是最优解之一。

接下来考虑多重背包,设 \(f_a\) 表示各个数字和为 \(a\) 的最大幸运值。

先特殊处理了平凡的数,从 \(0\)\(999999\) 枚举一次,让 \(f_i=\sum_{x} [i_x \% 3=0] \frac{x}{3} F_x\)

第三个观察: 如果一个数位填 \(6\),那么相当于填两个 \(3\),如果填 \(9\) 就相当于填 \(3\)\(3\)

之后,对于每一个数位,我们全部一起做,只需要考虑都是幸运数字就行了。

接下来相当于是有 \((k-1)\) 个数字的这个数位都可以填 \(0~3\)\(3\),所以有 \(3(k-1)\) 个这样的物品,每一个重量是 \(3\times 10^{这是第几位}\),价值是 \(F_{这个数位}\)

那么显然可以用二进制分组优化一下这个多重背包,然后就做完了。

posted @ 2026-08-26 23:18  kingho_zjh  阅读(12)  评论(0)    收藏  举报