洛谷P6767 [BalticOI 2020/2012 Day0] Roses 题解

发布时间 2023-08-12 21:58:25作者: Happy-Pig-Orz

翻了一下已有的题解,似乎没有针对此题本质即线性规划做的题解,故作分享。

可以由此题抽象出一类问题的模型,做训练的效果还是非常好的。

题意简述

要选择 \(N\) 个物品,有两种方案,每花费 \(C\) 元可以买 \(A\) 个,每花费 \(D\) 元可以买 \(B\) 个。

分析

对于这一题,题目有明确提示,可以买大于等于 \(N\) 朵花,于是不妨设花费 \(A\) 元的次数为 \(x_{1}\),花费 \(C\) 元的次数为 \(x_{2}\),于是得到不等式:

\[Ax_{1}+Cx_{2}\geq N(x_{1},x_{2}\geq 0) \]

于是题目转化为在满足上述条件的前提下求多项式 \(Bx_1+Dx_2\) 的最小值。

让我们重新审视这个过程:

  • 由题意得到多个变量。

  • 得到包含所有变量的条件,并且条件是关于变量的线性不等式。

  • 要求一个包含变量的一次多项式(PS:大部分情况下线性可以理解成变量次数为 \(1\))的最值。

不难发现,这是一个经典的线性规划问题,即在线性约束条件下线性目标函数极值问题(引自OI-Wiki)。

名词解释:

  1. 约束条件就是题目中变量要满足的的条件,例如此题即为 \(Ax_{1}+Cx_{2}\geq N\)\(x_{1},x_{2}\geq 0\),一般情况下若无特殊说明,变量为非负整数即 \(x_i \in N^+\) 是默认条件(结合线性规划这个问题模型本身就用来解决实际问题这一背景就很好理解了)。

  2. 目标函数就是要求的式子构成的函数,此题可以看成 \(z=Bx_1+Dx_2\)

求解

了解的问题的本质后,首先要将线性规划转化为标准型,即:目标函数取最大值(PS:这里网上各个教程不太相同,取更为通用的最大值进行讲解,网上也有讲解最小值的,可以查找一下加深理解);所有的约束条件均为等式。

要怎么做呢?

对于目标函数的处理不难想到将原来的目标 \(\min z=Bx_1+Dx_2\) 转化为 \(-(\max z=-Bx_1-Dx_2)\),因此只要求出 \(\max z=-Bx_1-Dx_2\) 就可以得到答案。

而对于条件 \(Ax_{1}+Cx_{2}\geq N\),我们可以引入一个人工变量 \(x_{3}\),同样 \(x_3\geq0\),因为目标函数 \(z\) 中不含有 \(x_3\) 项,因此 \(x_3\) 的取值不会影响结果。不妨先假设约束条件是大于等于,例如 \(x_1+x_2\geq0\),那么很容易想到在 \(x_3\geq0\) 的前提下直接在原式上加入 \(x_3\) 项变为 \(x_1+x_2+x_3=0\) 也符合条件,因为原目标函数只可能含有原本出现的 \(x_1\)\(x_2\) 变量,所以 \(x_3\) 的引入和取值都对结果没有任何影响。类比于此,可以得到对于小于等于这一条件我们可以在原约束的左侧做一个减去一个人工变量 \(x_3\) 的处理,此时约束条件就可以变成 \(Ax_1+Bx_2-x_3=N\)。显然,等式是比不等式要好处理得多的。

此时我们就得到了这一题线性规划的标准型如下:

\( \max z=-Bx_1-Dx_2 \)

\(s.t. \left\{ \begin{aligned} Ax_1+Cx_2-x_3=N\cr x_i\geq0,i=1,2,3 \end{aligned} \right.\)

同时可以将标准型转化为矩阵形式。

\(\begin{bmatrix}-B & -D & 0 & 0\cr A & C & -1 & N\end{bmatrix}\)

解释:线性规划标准型的矩阵形式第一行表示目标函数,除最后一项外均表示函数中对应变量的系数,其中人工变量均为 \(0\),这样才不会影响结果。接下来每一行对应一个等式约束,除最后一项外均表示约束中对应变量的系数,最后一项表示等式右边的常数项。

至此线性规划模型就完成了建立,对于标准型的求解,可以套用单纯形算法的模板进行求解,这里不再赘述。由于矩阵唯一确定为 \(2\times4\) 的矩阵,此时的时间复杂度近似常数,是一个相当优秀的算法。