zoukankan      html  css  js  c++  java
  • 01分数规划学习

    真的是很差啊,这个东西弄了好久也没看懂。主要是数学比较差的原因吧。

    网上把一些不等式啊啥的略了,我就mengbi了。


    最普通的01分数规划是这样一个基本问题http://poj.org/problem?id=2976。就像这样吧。

    每个物品有一个价值${a}_{i}$,花费${b}_{i}$。要求的是选其中$k$个,使得

      $R=sum frac{{a}_{i}*{x}_{i}}{{b}_{i}*{x}_{i}}$

    最大。

    这里的${x}_{i}$非0即1,表示是否选取该物品。

    我们有一个函数$F(t)=sum ({a}_{i}*{x}_{i})-t imes sum ({b}_{i}*{x}_{i})$,假设我们能在可接受的复杂度内求出是否有一种${x}_{i}$的取值,能使得$F(t)geq 0$。

    由$F(t)$的定义式及$F(t)geq 0$的条件,经过简单的移项可得$sum frac{{a}_{i}*{x}_{i}}{{b}_{i}*{x}_{i}}geq t$

    又由$R$的定义式,上式左边不就是$R$吗?!所以只要存在$F(t)geq 0$,我们就能知道是存在一种${x}_{i}$的取值能让$R$大于等于$t$的。

    显然在满足存在${x}_{i}$使得$F(t)geq 0$的条件下,$t$的取值越大,我们就越逼近$R$的最大值。当我们找不到一种${x}_{i}$的取值能让$F(t)geq 0$时,就说明$R$是不能大于等于$t$的。

    所以得出:当我们找到这样一个$t$,它本身可行但再大一点就找不到${x}_{i}$取值集合能让$F(t)geq 0$,那么可以认为,$t$就是我们要求的$R$的最大值。显然这是可以二分解决的。

    那么问题只剩下了,如何判定是否存在${x}_{i}$取值集合能让$F(t)geq 0$??

    由$sum $的性质,我们求出每个物品的${a}_{i}-t*{b}_{i}$,想让$F(t)$尽量大且只能选$k$个,就选${a}_{i}-t*{b}_{i}$最大的前$k$个,自然就使得$F(t)$最大了!

    问题至此就解决了。二分$t$,每次判定$F(t)$是否可能大于等于0,可以的话提高下界,否则降低上界。结果即所求。

  • 相关阅读:
    【基础算法】- 全排列
    【基础算法】- 2分查找
    区块链培训
    Static Binding (Early Binding) vs Dynamic Binding (Late Binding)
    test
    No data is deployed on the contract address!
    "throw" is deprecated in favour of "revert()", "require()" and "assert()".
    Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning.
    京都行
    Failed to write genesis block: database already contains an incompatible
  • 原文地址:https://www.cnblogs.com/orzzz/p/7461871.html
Copyright © 2011-2022 走看看