显然我们要搞完全背包了。拼出一个数需要的糖果数就是物品的花费,得到金币数就是物品的价值,总糖果数是背包的大小。这样想非常简单,代码也简单,这里就不贴了。
那么你直接写好交上去,就会 TLE 555 个点。看这优美的数据范围,我们就知道要优化了。
摆在我们面前的是两条路:
* 生成函数优化:
你们真以为我会吗
* 想一个其它的优化方法。
显然后者符合实际。认真地瞪数据范围,我们发现拼出每一个数需要的糖果数都在 [1,63][1,63][1,63] 以内。原因很简单,因为最多拼成一个数只需要 636363 个糖果(888888888888888888888888888)。既然有这么多花费相同的物品,我们当然只想要价值最高的那个呀。于是,物品个数就被压到了 636363 个。O(nm)O(nm)O(nm) 的朴素背包在 n=63,m=100000n=63,m=100000n=63,m=100000 的数据范围下可以安全跑过。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
提示:多测不清空,爆零两行泪。