zoukankan      html  css  js  c++  java
  • 并不对劲的01分数规划

    做了spfa求平均值最小的环的问题,刚意识到“原来这是01分数规划啊”,就在这里并不对劲地说分数规划问题了。

    01分数规划解决的是哪一种问题呢?有两个大小一样的数组A[1...n]和B[1...n],要求出数组Q[1...k],使( A[Q[1]] + A[Q[2]] + ... + A[Q[3]]) / ( B[Q[1]] + B[Q[2]] + ... + B[Q[3]] )最大。

    有一种听上去很靠谱的贪心做法:把所有位置i按照A[i]/B[i]排序,取最靠前的k个。

    这样如果A[1...n]和B[1...n]全是正数就没什么问题,但是要是有的是负数呢?想必是会出错的,因为如果对于位置i,A[i]正B[i]负,(A[i]/B[i])就是个负数,会排在靠后的位置,但是B[i]为负,会使分母减少,如果分母减B[i]为正的话反而该选B[i]。要是考虑了这种情况,又要考虑选了太多负数导致最后算出的分数是负数的情况、分母和分子都是负数使得答案负负得正的情况…听上去很麻烦,不可做。

    但是会发现当存在x≤( A[Q[1]] + ... + A[Q[k]]) / ( B[Q[1]] + ... + B[Q[k]])时,对于x'<x一定存在x'<=( A[Q'[1]] + ... + A[Q'[k]]) / ( B[Q'[1]] + ... + B[Q'[k]]),有单调性的话,就可以二分了。

    那该怎么判断是否存在Q[1...k]使得x ≤ ( A[Q[1]] + ... + A[Q[k]]) / ( B[Q[1]] + ... + B[Q[k]])呢?稍微变一下形。

    x * ( B[Q[1]] + ... + B[Q[k]]) ≤ ( A[Q[1]] + ... + A[Q[k]]) 

    0 ≤ ( A[Q[1]] + ... + A[Q[k]]) - x * ( B[Q[1]] + ... + B[Q[k]])

    0 ≤ ( A[Q[1]] - x * B[Q[1]]) + ... + (A[Q[k]] - x * B[Q[k]])

    这看上去就很好判断了。

    分数规划问题想必是不可能这么简单的,可能还会有其他奇怪的限制(不是只限制个数k),或者是每个数可以取多个。据说分数规划题的难度不在分数规划上?

  • 相关阅读:
    中途接手一个项目时候,需要注意
    PPT做交互效果
    hyperledger学习资料
    k8s拾遗
    Day0-3. 部署docker镜像私有仓库harbor
    Day0-2. Docker安装部署
    Day0-1. Docker环境准备
    【转载】轻量级HTTP服务器Nginx(Nginx性能优化技巧)
    使用nginx-module-vts监控各虚拟主机的流量
    Linux系统下终端proxy代理配置
  • 原文地址:https://www.cnblogs.com/xzyf/p/9609531.html
Copyright © 2011-2022 走看看