POJ 2976--Dropping tests(Dinkelbach求0/1规划)

博客探讨了如何使用Dinkelbach算法解决规模为N的数组A和B的0/1规划问题,目标是找到k个位置,使得A的元素和除以B的元素和最大化。通过构建关于比例L的分段线性凹函数,利用二分法和函数的凹性逐步逼近最大比例L_max。文章介绍了算法的迭代过程,并将其与牛顿迭代法进行类比。
摘要由CSDN通过智能技术生成

题意:类似于GPA求解的过程,给定两个规模为N的数组A,B,其中A的数小于等于相同位置上B的数,请选择k个位置,使A中数的和除以B中数的和达到最大。

题解:类似于背包,每个位置有0,1两种选择。

  • 设N维列向量X,其中只包含0,1两种元素。则A*X就等于分子的和,B*X就相等于与分母的和。
  • 设相除的结果为L,即L = (A*X)/(B*X)。
  • 我们设一关于L的函数,Z = A*X-(B*X)*L,其中X只含有k个1,且在给定L的情况下使Z值最大,可以通过排序求得Z值(易知X向量是可能随L变化的)。注意Z是一个关于L的分段线性的凹函数。
一、二分法
  • 二分法的一般步骤就是首先给出所求值的大致范围,然后根据单调性逐渐缩小这个范围达到所需的精度。
  • 设最大的比值为L_max,即
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值