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),或者是每个数可以取多个。据说分数规划题的难度不在分数规划上?

  • 相关阅读:
    springboot 获取enviroment.Properties的几种方式
    Spring Boot加载配置文件的完整步骤
    SpringBoot测试Controller层
    SpringBoot集成测试
    PowerMockito模拟private static final类变量
    玩转Spring JUnit+mockito+powermock单元测试
    Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法
    spring boot 使用@ConfigurationProperties加载配置文件到类中
    Rsync命令参数详解
    Linux PS 命令详解
  • 原文地址:https://www.cnblogs.com/xzyf/p/9609531.html
Copyright © 2011-2022 走看看