首页 > 其他分享 >01 分数规划

01 分数规划

时间:2024-02-01 09:47:23浏览次数:25  
标签:分数 ix 01 cdot dfrac sum ans 规划 lambda

有 \(n\) 个 01变量 \(x_1\sim x_n\),同时有 \(a_1\sim a_n,b_1\sim b_n\).

同时有约束条件:用集合 \(S\) 表示,这个 \(S\) 中每一个元素表示一个 \(x_1\sim x_n\) 的取法。(平时见到的题不咋有约束)

我们要给 \(x_1\sim x_n\) 赋值,使得 \(\dfrac{\sum x_ia_i}{\sum x_ib_i}\) 最大,还要满足 \(x_1\sim x_n\) 的取法 \(\in S\)。


先看看这个初始问题怎么解,再看拓展。

定义:

\(R(x)=\dfrac{\sum a_ix_i}{\sum b_ix_i}\),\(R^*=\displaystyle\max_{x\in S}R(x)\),目标是求得 \(R^*\)。

\(F_{\lambda}(x)=\sum a_ix_i-\lambda\sum b_ix_i\)。定义 \(F_{\lambda}^{*}=\displaystyle \max_{x\in S}F_{\lambda}(x)\)

重要定理:

\(R^*>\lambda \iff F_{\lambda}^*>0\),\(R^*\ge\lambda \iff F_\lambda^*\ge0\)。

如果证明了这个定理,我们就可以得出:

(\(R^*\) 与 \(\lambda\)) 的大小关系,和 (\(F_\lambda^*\) 与 \(0\)) 的大小关系相同。

定理证明:

\(R^*>\lambda\iff \exists \,x\in s,R(x)>\lambda\iff \exists x\in S,\sum a_ix_i>\lambda\sum b_ix_i\iff \exists x\in S,\sum a_ix_i-\lambda\sum b_ix_i>0\iff \exists x,F_{\lambda}(x)>0\iff F_{\lambda}^*>0\)

把 \(>\) 改成 \(\ge\),证明过程也还是正确的。证毕。

如此我们就可以二分,然后利用 \(F_\lambda^*\) 判断 \(R^*\) 是否可行。

注意:这里 \(F_\lambda(x),F_\lambda^*\) 的作用只是帮助我们判断 \(R^*\) 是否可行。具体我们要怎么求出 \(F_\lambda^*\),就具体问题具体分析。


例题:Earthquake

每个边有两个属性 \(c_i,t_i\)。选出图中的一些边,构成生成树,使得 \(\dfrac{f-\sum c_ix_i}{\sum t_ix_i}\) 最大,\(x_i=0\) 表示此边没选,\(x_i=1\) 表示此边选了。其中 \(f\) 是给定的数。

解:

记 \(ans=\dfrac{f-\sum c_ix_i}{\sum t_ix_i}\),\(f-\sum c_ix_i-ans\cdot\sum t_ix_i=0.\)

目标是使 \(ans\) 最大。

这里的 \(F_{\lambda}(x)=f-\sum c_ix_i-\lambda\cdot \sum t_ix_i\)。当我们二分一个 \(\lambda\) 判断是否可行,就是要判断 \(F_\lambda^*=\displaystyle\max_{x\in S}F_\lambda(x)\) 是否 \(>0\),其中 \(S\) 是所有使得选出的边构成生成树的 \(x\) 的集合。

那么 \(F_{\lambda}(x)=f-\sum c_ix_i - \lambda\cdot \sum t_ix_i=f-\sum x_i\cdot (c_i-\lambda t_i).\)

要 \(F_\lambda(x)\) 最大,\(f\) 是常数,所以就是要 \(\sum x_i\cdot (c_i-\lambda t_i)\) 最小。

问题变成了:有一些边,可以选或者不选(\(x_i=0/1\)),每条边有一个属性 \(c_i-\lambda t_i\),要求选一些构成生成树(\(x\in S\)),使得选出的这些边属性之和最小。

这不就是最小生成树吗?我们将每条边的权值赋值为 \(c_i-\lambda t_i\),然后跑最小生成树得到最小总和 \(sum\),再判断 \(f-sum\) 是否为正即可。


最小圈

老经典了。

\(ans=\dfrac{\sum w_ix_i}{\sum 1\cdot x_i}\) 最小。

\(F_\lambda(x)=\sum x_i\cdot(w_i-\lambda)\),\(x\in S\),这里 \(S\) 是所有构成环的边的选法集合。

我们要 \(ans\) 最小,也就是要 \(F_\lambda^*=\min F_\lambda(x)<0\),也就是要选出若干条边构成环使得环的边权和小于 \(0\)。

这就是 SPFA 判负环。所以我们二分 \(\lambda\),每条边的边权设置为 \(w_i-\lambda\) 然后判断是否有负环。若有,答案可以更小;否则,答案更大。


Signtseeing Cows

\(ans=\dfrac{\sum v_ix_i}{\sum e_ix_i}\) 最大。

\(F_\lambda(x)=\sum x_i\cdot (v_i-\lambda\cdot e_i)\),\(x\in S\),这里 \(S\) 是所有构成环的选边方案。

要 \(ans\) 最大,也就是 \(F_\lambda^*=\max F_\lambda(x)>0\),也就是 \(\sum x_i(v_i-\lambda e_i)>0\)。

但是我们只整过负环的啊?大于 \(0\) 怎么弄?

很简单:\(\sum x_i(\lambda e_i-v_i)<0\)。

还有最后一问题:一条边的边权要设成 \(\lambda e_i-v_i\),那么这个 \(v_i\) 是跟着哪个端点呢?

注意到原图是有向图(无向图当作两个相反边),我们让每条边的 \(v_i\) 都跟着出点或者都跟着入点即可。

Hiking

如果你发现用 \(\sum_{i=1}^nx_ia_i\) 难以表示出分子/分母,可以尝试直接用 \(\sum_{i=1}^{cnt} a_i\) 来表示。

例如此题,如果用 \(\sum_{i=1}^n\) 的方式,\(ans=\dfrac{?}{\sum_{i=1}^n x_ib_i}\),发现分子不好表示。

所以我们转而用 \(ans=\dfrac{\sum_{i=1}^{cnt}\sqrt{|l-x_i+x_{i-1}|}}{\sum_{i=1}^{cnt}b_i}\) 表示。

\(F_\lambda(x)=\sum_{i=1}^{cnt}(\sqrt{|l-x_i+x_{i-1}|}-\lambda b_i)\)。要使其最大。

\(x\in S\),\(S\) 是使得 \(x_{cnt}=x_n\) 的所有选法集合。

我们可以用 DP 来求 \(F_\lambda(x)\) 最大是多少。

\(dp[i]\) 表示前 \(i\) 个落脚地,最后一天在第 \(i\) 个落脚地休息的最大 \(\sum_{i=1}^{cnt}(\sqrt{|l-x_i+x_{i-1}|}-\lambda b_i)\) 是多少。\(O(n^2)\) 做 DP。

判断 \(dp[n]\) 的正负即可。

(DP 还原方案不再多说了)


新生舞会

构建01分数规划 “选物品” 的模型。

画一张 \(n\times n\) 的方格表,格子 \((i,j)\) 代表第 \(i\) 个男生与第 \(j\) 个女生配对。我们要从这些格子里面选一些,让这些格子的 \(\dfrac{\sum a_i}{\sum b_i}\) 最大。

\(x\in S\),\(S\) 是选出一些格子且每行每列恰有 \(1\) 个格子选出的选法集合。

\(F_\lambda(x)=\sum x_i(a_i-\lambda b_i)\),也就是说我们重新设每个格子的价值 \(c_i=a_i-\lambda b_i\)。我们要 \(ans\) 尽量大,所以就要 \(F_\lambda^*\) 尽量大。

如何二分判定:每个匹配的价值是 \(a_i-\lambda b_i\),求二分图带权最大完美匹配。直接上费用流。

标签:分数,ix,01,cdot,dfrac,sum,ans,规划,lambda
From: https://www.cnblogs.com/FLY-lai/p/18000554

相关文章

  • 【2024-01-31】早有面子了
    20:00人生的事,苦乐必定相伴,而且成正比例。吃苦愈多,享乐愈大,反之,不吃苦就不得享乐。这是丝毫不爽的定理。                                                 ——丰子恺......
  • 20240130
    Kotlin编程知识总结总结自《Android第一行代码》变量varval可变变量不可变变量自动类型推导:vala=10显式声明类型:vala:Int=10函数关键词funfunmethodName(param1:Int,param2:Int):Int{ return0}语法糖funmethodName(param1:Int,param2:Int):......
  • 01 python简介和环境搭建
    简介Python是简单易用人工智能前端语言够用,但是实际工作中远远不够。Python最好作为第二语言。优点:设计哲学:优美胜于丑陋,明了胜于晦涩,简介胜于复杂。为什么用Python简易:易学易用,门槛低快:开发快,像胶水可以快速粘接万物。运用广:科学计算、自动化运维、云计算服务、网络爬虫、数据......
  • 动态规划 背包问题
    01背包 二维//二维#include<iostream>#include<cmath>usingnamespacestd;constintN=1010;intp[N][N]={0};intv[N];intw[N];intm,n;intmain(){cin>>n>>m;for(inti=1;i<=n;i++){cin>>v[i]>>w[i];......
  • 洛谷 P4580 [BJOI2014] 路径
    传送门分析可以考虑dp。先朴素地定义\(dp[i][j]\)表示当前在结点\(i\),已经走过了\(j\)个结点(含当前)的方案数。发现没法处理括号匹配,于是加一维\(k\)表示当前还剩\(k\)个前括号没有匹配。又发现没法处理前导\(0\)。于是考虑再加一维表示当前的最后一位是什么状态。发......
  • 洛谷 P3976 [TJOI2015] 旅游
    这出题人语言表达能力真的感人……希望你们看完这篇题解后不要觉得我的语言表达能力和出题人不相上下。题目大意给定一棵有点权的树,每次询问从\(u\)到\(v\)的路径上后经过的点权减去先经过的点权的最大值,再把这条路径上所有点的点权加上一个给定的数。分析俗话说得好:如果......
  • [word] word 2016没有公式编辑器吗
    word2016有公式编辑器。找到word2016里面自带的编辑器,插入–对象–找到MAthtapy3.0公式-确定就可以啦这样我们就可以对我们需要输入的公式进行编辑了,如果输入两个接连的公式,可以按一下空格键。......
  • [office] excel2010工作表的切换与重命名
    在使用excel工作表时,我们可能会对多个工作表进行来回切换查看,今天小编为大家介绍一下如何切换工作表及重命名工作表。一、切换工作表切换工作表主要有两种方法:1、直接使用鼠标对工作表标签sheet进行点击切换;2、使用快捷键,ctrl+pageup和ctrl+pagedown键,可以快速进行工作表切换。二......
  • 题解 P6491 [COCI2010-2011#6] ABECEDA
    传送门。分析两个字符大小关系不变,并且具有传递性,我们可以联想到拓扑排序来解决。因此,我们就通过字符串的大小关系,推断出一些字符的大小关系,然后拓扑排序即可。#include<bits/stdc++.h>#include<vector>#include<string>#include<queue>//#defineintlonglongusing......
  • 探索性测试-01
    一、探索式测试的目标理解应用程序如何工作,接口看起来怎样,实现了哪些功能;强迫软件展示其全部能力;(压力测试、负载测试)找到缺陷。二、漫游测试商业区:位于软件的启动及关闭代码之间,包含用户所要使用的软件特性和功能。历史区:从前版本遗留下的代码,还有曾经出现较多缺陷的特......