• 【学习笔记】子集和问题


    零、问题引入

    子集和问题 Subset-sum Problem (SSP) \text{Subset-sum Problem (SSP)} Subset-sum Problem (SSP),其意在求解关于 ξ ( S ) = { ∑ i ∈ T w i    ∣    T ⊆ S } \xi(S)=\{\sum_{i\in T}w_i\;|\;T\subseteq S\} ξ(S)={iTwiTS} 的信息。

    如果求解的是 ξ ( S ) \xi(S) ξ(S) 某个值附近的信息,根据背包过程,我们可以总在该值附近浮动。这被称为 balancing \textit{balancing} balancing

    利用它,我们可以 O ( n W ) \mathcal O(nW) O(nW) 求解某个值的最近邻信息,比如 max ⁡ { i    ∣    i ∈ ξ ( S ) ,    i ⩽ C } \max\{i\;|\;i\in\xi(S),\;i\leqslant C\} max{iiξ(S),iC},其中 W = max ⁡ { ∣ w i ∣ } W=\max\{|w_i|\} W=max{wi}

    壹、平衡

    Theorem. 可以在 O ( n ) \mathcal O(n) O(n) 时间内得到 C ∈ [ 0 , W ) C\in[0,W) C[0,W) 的问题。

    Proof. 若 C < 0 C<0 C<0 则所有数取反(我们仍求出了 C C C 的最近邻信息);不妨设 C ⩾ 0 C\geqslant 0 C0 。在 w i > 0 w_i>0 wi>0 上,贪心取极大子集 S S S 满足 ∑ i ∈ S w i ⩽ C \sum_{i\in S}w_i\leqslant C iSwiC,将 S S S 内元素取反、将 C C C 变为 C − ∑ i ∈ S w i C-\sum_{i\in S}w_i CiSwi 。根据流程,若有 i ∉ S i\notin S i/S 满足 w i > 0 w_i>0 wi>0 C < w i ⩽ W C<w_i\leqslant W C<wiW,否则 ∑ i ∈ S w i \sum_{i\in S}w_i iSwi 就是 C C C 的最近邻。 ■ \blacksquare

    下文可能将 x x x 视作解向量。

    Definition 1. 平衡填充 balanced   filling \textit{balanced filling} balanced filling x x x 是从 x j = 0    ( j = 1 , … , n ) x_j=0\;(j=1,\dots,n) xj=0(j=1,,n) 开始,进行若干 平衡调整 得到的,具体而言:

    • x j = 0    ( j = 1 , … , n ) x_j=0\;(j=1,\dots,n) xj=0(j=1,,n) 是平衡填充。
    • 平衡加. 对于平衡填充 x x x 满足 w ⋅ x ⩽ C w\cdot x\leqslant C wxC,取 x t = 0    ( w t ⩾ 0 ) x_t=0\;(w_t\geqslant 0) xt=0(wt0),令 x t = 1 x_t=1 xt=1 得到的 x ′ x' x 是平衡填充。
    • 平衡减. 对于平衡填充 x x x 满足 w ⋅ x > C w\cdot x>C wx>C,取 x s = 0    ( w s < 0 ) x_s=0\;(w_s<0) xs=0(ws<0),令 x s = 1 x_s=1 xs=1 得到的 x ′ x' x 是平衡填充。

    Proposition. 对于 C C C 的(任意一侧)最近邻,存在解 x x x 是平衡填充。

    Proof. 显然。以负方向最近邻为例。从 x j = 0    ( j = 1 , … , n ) x_j=0\;(j=1,\dots,n) xj=0(j=1,,n) 开始,不断平衡加,总重超过 C C C 就平衡减。 ■ \blacksquare

    Corollary. 平衡填充总满足 C − W < w ⋅ x ⩽ C + W C-W<w\cdot x\leqslant C+W CW<wxC+W

    贰、平衡算法

    设可重集 U = { w i } \Bbb U=\{w_i\} U={wi},记 A = [ − W , 0 ] ∩ U ,    B = U ∖ A A=[-W,0]\cap\Bbb U,\;B=\Bbb U\setminus A A=[W,0]U,B=UA 。设 A = { a 1 , … , a ∣ A ∣ } ,    B = { b 1 , … , b ∣ B ∣ } A=\{a_1,\dots,a_{|A|}\},\;B=\{b_1,\dots,b_{|B|}\} A={a1,,aA},B={b1,,bB}

    Definition 2. 对于 s ∈ [ 0 , ∣ A ∣ ] ,    t ∈ [ 0 , ∣ B ∣ ] s\in[0,|A|],\;t\in[0,|B|] s[0,A],t[0,B] μ ∈ ( C − W ,    C + W ] \mu\in(C-W,\;C+W] μ(CW,C+W],定义
    f s , t ( μ ) = [ ∃ S ,    ∑ i ∈ S w i = μ ] s.t. S ⊆ { a 1 , … , a s } ∪ { b 1 , … , b s } S  forms a balanced filling f_{s,t}(\mu)=\left[\exist S,\;\sum_{i\in S}w_i=\mu\right]\\

    s.t.S{a1,,as}{b1,,bs}S forms a balanced filling
    fs,t(μ)=[S,iSwi=μ]s.t.S{a1,,as}{b1,,bs}S forms a balanced filling

    其中 balanced filling \text{balanced filling} balanced filling 是平衡填充。虽然前面是用 “向量” 的口吻定义的,换成集合想必也不会引起误会。

    显然只需考虑 f s , t ( μ ) = 1 f_{s,t}(\mu)=1 fs,t(μ)=1 的三元组 ( s , t , μ ) (s,t,\mu) (s,t,μ) 。注意到 t , μ t,\mu t,μ 固定时 s s s 越小越好。

    Definition 3. 对于 t ∈ [ 0 , ∣ B ∣ ] t\in[0,|B|] t[0,B] μ ∈ ( C − W ,    C + W ] \mu\in(C-W,\;C+W] μ(CW,C+W],定义
    s t ( μ ) = min ⁡ { s : f s , t ( μ ) = 1 } s_t(\mu)=\min\{s: f_{s,t}(\mu)=1\} st(μ)=min{s:fs,t(μ)=1}

    对其进行 d p \tt dp dp 。按照 t t t 从小到大的顺序,每次考虑是否进行平衡加和平衡减。

    定义 s t ( μ ) = ∣ A ∣ + 1 s_t(\mu)=|A|+1 st(μ)=A+1 若不存在对应的 s s s 。于是有如下伪代码:
    Algorithm  balsub 1 for   μ ← C − W + 1   to   C + W   do   2 s 0 ( μ ) ← ∣ A ∣ + 1 3 s 0 ( 0 ) ← 0 4 for   t ← 1   to   ∣ B ∣   do 5 for   μ ← C − W + 1   to   C + W   do 6 s t ( μ ) ← s t − 1 ( μ ) 7 for   μ ← C − W + 1   to   C   do   8 μ ′ ← μ + b t 9 s t ( μ ′ ) ← min ⁡ { s t ( μ ′ ) ,    s t − 1 ( μ ) } 10 for   μ ← C + W   downto   C + 1   do 11 for   j ← s t ( μ ) + 1   to   s t − 1 ( μ )   do 12 μ ′ ← μ + a j 13 s t ( μ ′ ) ← min ⁡ { s t ( μ ′ ) ,    j }

    Algorithm balsub1for μCW+1 to C+W do 2s0(μ)|A|+13s0(0)04for t1 to |B| do5for μCW+1 to C+W do6st(μ)st1(μ)7for μCW+1 to C do 8μμ+bt9st(μ)min{st(μ),st1(μ)}10for μC+W downto C+1 do11for jst(μ)+1 to st1(μ) do12μμ+aj13st(μ)min{st(μ),j}
    12345678910111213Algorithm balsubfor μCW+1 to C+W do s0(μ)A+1s0(0)0for t1 to B dofor μCW+1 to C+W dost(μ)st1(μ)for μCW+1 to C do μμ+btst(μ)min{st(μ),st1(μ)}for μC+W downto C+1 dofor jst(μ)+1 to st1(μ) doμμ+ajst(μ)min{st(μ),j}

    5 – 6 5–6 56 行是不进行平衡加。第 7 – 11 7–11 711 行进行平衡加。第 12 – 13 12–13 1213 行在 s t ( μ ) s_t(\mu) st(μ) 对应的方案上做了平衡减。注意 11 11 11 行处 j = ∣ A ∣ + 1 j=|A|+1 j=A+1 可能出现,此时转移应当被忽略。

    最关键处在于第 11 11 11 行的上界 s t − 1 ( μ ) s_{t-1}(\mu) st1(μ) 。这是因为 j > s t − 1 ( μ ) j>s_{t-1}(\mu) j>st1(μ) 时,与之等效的转移可以在 s t − 1 ( μ ) s_{t-1}(\mu) st1(μ) 上完成。这直接使得第 11 11 11 行的循环次数,对于每个 μ \mu μ,是 ∑ t s t − 1 ( μ ) − s t ( μ ) = s 0 ( μ ) − s ∣ B ∣ ( μ ) ⩽ ∣ A ∣ \sum_{t}s_{t-1}(\mu)-s_{t}(\mu)=s_0(\mu)-s_{|B|}(\mu)\leqslant |A| tst1(μ)st(μ)=s0(μ)sB(μ)A 。因此总复杂度 O ( n W ) \mathcal O(nW) O(nW)

    通过该数组,我们可直接求出 max ⁡ { i : i ⩽ C ,    i ∈ ξ ( U ) } = max ⁡ { z : z ⩽ C ,    s ∣ B ∣ ( μ ) ≠ ∣ A ∣ + 1    } \max\{i:i\leqslant C,\;i\in\xi(\Bbb U)\}=\max\{z:z\leqslant C,\;s_{|B|}(\mu)\ne |A|+1\;\} max{i:iC,iξ(U)}=max{z:zC,sB(μ)=A+1},或者 min ⁡ { ∣ i − C ∣ : i ∈ ξ ( U ) } = min ⁡ { i : s ∣ B ∣ ( C ± i ) ≠ ∣ A ∣ + 1 } \min\{|i-C|:i\in\xi(\Bbb U)\}=\min\{i:s_{|B|}(C\pm i)\ne|A|+1\} min{iC:iξ(U)}=min{i:sB(C±i)=A+1}

    叁、引用

    D. Pisinger, Linear time algorithms for knapsack problems with bounded weights, Journal of Algorithms. 33 (1999) 1–14 10.1006/jagm.1999.1034.

    Chao Xu, Subset sum through balancing, personal blog.

  • 相关阅读:
    一本通1052;计算邮资
    05 vue 计算属性的练习 1 methods \computed\ watch三种方法对比实例
    Servlet
    用HTML+CSS做一个漂亮简单的轻量级图片相册博客网站(web前端期末大作业)
    LabVIEW前面板上的字体大小取决于操作系统
    第二十二章 控制进程(三)
    域名备案流程(个人备案,腾讯云 / 阿里云)
    Spring MVC 中的数据绑定和验证机制是什么,如何使用
    docker使用bind9实现域名解析
    [构造]Build Permutation Codeforces1713C
  • 原文地址:https://blog.csdn.net/qq_42101694/article/details/125510126