为了更好的说明,我们先简单回顾一下背包问题的优化问题,考虑01背包问题,我们的优化问题有如下形式:
max
x
i
∑
i
x
i
v
i
s
.
t
.
∑
i
x
i
w
i
≤
W
x
i
∈
{
0
,
1
}
\max_{x_i} \sum_i x_iv_i\\ s.t. \quad \sum_i x_iw_i \le W\\ x_i \in \{0, 1\}
ximaxi∑xivis.t.i∑xiwi≤Wxi∈{0,1}
这个式子很好理解,
x
i
x_i
xi就是我们的要优化的决策变量,也就是第
i
i
i个物品放或者不放,所以它只有两种取值0或者1;
v
i
v_i
vi就是我们第
i
i
i个物品的价值,
w
i
w_i
wi就是我们第
i
i
i个物品的重量,
W
W
W就是背包的容量
当然在上面也会有很多小的变形,比如让约束中的不等号变成等号(如找零钱问题),
x
i
x_i
xi的取值范围变化(完全背包或者多重背包),最优解问题转成可行解问题(如能否能找到一种方法,恰好填满包)等等
优化问题转换
我们回到我们遇到的这个问题,首先我们形式化一下这个问题:
max
x
i
,
y
i
∑
i
x
i
l
i
s
.
t
.
∑
i
x
i
l
i
=
∑
i
y
i
l
i
x
i
,
y
i
∈
{
0
,
1
}
,
x
i
+
y
i
≤
1
\max_{x_i, y_i} \sum_i x_il_i\\ s.t. \quad \sum_i x_il_i = \sum_i y_il_i\\ x_i, y_i \in \{0, 1\}, x_i + y_i \le 1
xi,yimaxi∑xilis.t.i∑xili=i∑yilixi,yi∈{0,1},xi+yi≤1
我形式化的方法是引入两个决策变量
x
i
x_i
xi和
y
i
y_i
yi,前者表示第
i
i
i个小棒接入第一个长棒,后者表示
i
i
i个小棒是否接入第二个。然后我们要求
x
i
x_i
xi和
y
i
y_i
yi至多有一个为1,所以有了上面的约束。
这里就有一个很好的性质了,由于
x
i
x_i
xi和
y
i
y_i
yi其实只有三种可能出现的情况:
(
0
,
1
)
,
(
1
,
0
)
,
(
0
,
0
)
(0, 1), (1, 0), (0, 0)
(0,1),(1,0),(0,0),这三种情况对应的
z
i
z_i
zi恰好是不同的也就是
{
−
1
,
1
,
0
}
\{-1, 1, 0\}
{−1,1,0}三种情况,也就是说我们找到这个映射是在
x
i
x_i
xi和
y
i
y_i
yi定义域上的一个一一映射,因此我们只需要约束
z
i
∈
{
−
1
,
1
,
0
}
z_i \in \{-1, 1, 0\}
zi∈{−1,1,0},那么就可以没有遗漏也没有多余的包含了原始问题的可行域(满足约束条件的所有取值集合)
好了,这样我们就把约束条件变换好了,接下来我们看优化目标,我们要把其中的
x
i
x_i
xi换成
z
i
z_i
zi这样就完全变成对
z
i
z_i
zi的优化了。
其实跟根据刚才说的映射关系,我们很容易就得到一个形式不是特别好看的定义,就是如果
z
i
=
1
z_i = 1
zi=1,我们就把它加到优化目标里,否则不加,形式化定义就有:
max
z
i
∑
i
l
i
⋅
I
(
z
i
=
1
)
\max_{z_i} \sum_i l_i \cdot I(z_i = 1)\\
zimaxi∑li⋅I(zi=1)
其中
I
(
⋅
)
I(\cdot)
I(⋅)是一个指示函数,当条件满足时为1,不满足时为0,有了这个形式我们其实就可以做dp了,不过我个人感觉形式不是特别的美观,所以又稍微调整了一下这个形式
根据映射关系,我们不难发现,有如下结论:
∑
i
∣
z
i
∣
l
i
=
∑
i
x
i
l
i
+
∑
i
y
i
l
i
=
2
∑
i
x
i
l
i
\sum_i |z_i| l_i = \sum_i x_i l_i + \sum_i y_i l_i = 2\sum_i x_i l_i
i∑∣zi∣li=i∑xili+i∑yili=2i∑xili
因为常数不影响优化结果,因此我们可以把优化问题变成如下形式:
max
z
i
∑
i
∣
z
i
∣
l
i
s
.
t
.
∑
i
z
i
l
i
=
0
z
i
∈
{
−
1
,
0
,
1
}
\max_{z_i} \sum_i |z_i| l_i\\ s.t. \quad \sum_i z_il_i = 0\\ z_i \in \{-1, 0, 1\}
zimaxi∑∣zi∣lis.t.i∑zili=0zi∈{−1,0,1}