题解:P13018 [GESP202506 七级] 调味平衡

设每种食材的差值 \(d_i=a_i-b_i\)、贡献 \(s_i=a_i+b_i\)。选择若干食材后若满足 \(\sum d_i=0\) 则酸甜平衡,此时希望最大化 \(\sum s_i\)。问题自然落到 01 背包:把 \(d_i\) 当成“重量”,把 \(s_i\) 当成价值,背包目标重量就是 \(0\)。关键是重量可正可负,因此出现了两种做法。

Solution A

先估计差值绝对值上界 \(D_{\max}=n\cdot500\le5\times10^{4}\),开长度 \(2D_{\max}+1\) 的整型数组 \(\text{dp}\),把零差映射到下标 \(B=D_{\max}\)。初始除 \(dp_B=0\) 其余皆 \(-\infty\)。每读一件物品若 \(d_i\ge0\) 就从大到小枚举下标,否则从小到大枚举,保证单件只被转移一次;时间复杂度 \(O(nD_{\max})\)

link

Solution B

map<int,ll> 只存真正出现的差值状态。每次处理食材时把当前 map 复制一份,枚举旧状态 \((\Delta,v)\),生成新差 \(\Delta+d_i\) 与价值 \(v+s_i\),若在副本中不存在或价值更优则更新。最后用 swap 取代原表。因为只维护可达差值集合,其大小往往远小于理论范围,尤其当 \(n\) 不大而单个 \(|d_i|\) 可能很大时能显著节省内存并减少遍历量(但实际上并不理想);最坏情况下复杂度仍趋近于上一种写法。

link

posted @ 2025-07-01 19:26  薛儒浩  阅读(172)  评论(0)    收藏  举报