『0/1分数规划 二分法』


0/1分数规划

模型

0/1分数规划指的是这样一个问题模型:

给定整数\(a_1,a_2,...,a_n\)和\(b_1,b_2,...,b_n\),求一组解\(x_1,x_2,...,x_n(\forall\ i\in[1,n],x_i=1,0)\),使得下式最大化:\[\frac{\sum_{i=1}^na_i*x_i}{\sum_{i=1}^nb_i*x_i}\]

简单地说,就是给定\(n\)对整数\(a_i,b_i\),从中选取若干对,使得选出的\(a\)之和与\(b\)之和的比值最大。

二分法

这个问题模型可以使用二分法解决。

不妨二分枚举一个数\(L\),然后考虑是否存在一组解,使得\(\sum_{i=1}^n(a_i-Lb_i)*x_i\geq 0\)。

\(1.\) 若存在一组解,使得\(\sum_{i=1}^n(a_i-Lb_i)*x_i\geq 0\),则显然有\(\sum_{i=1}^na_ix_i-L\sum_{i=1}^nb_ix_i\geq 0\),那么就有\[\exists \{x_1,x_2,...,x_n\},\frac{\sum_{i=1}^na_i*x_i}{\sum_{i=1}^nb_i*x_i}\geq L\]

就可以得到最优解一定大于等于\(L\)。

\(2.\) 若对于每一组解,都有\(\sum_{i=1}^n(a_i-Lb_i)*x_i< 0\),则同理可知
\[\forall \{x_1,x_2,...,x_n\},\frac{\sum_{i=1}^na_i*x_i}{\sum_{i=1}^nb_i*x_i}< L\]

就可以得到最优解一定不到\(L\)。

那么我们就可以依次进行二分答案,最后的结果就是\(L\)。

求解形如\(\sum_{i=1}^n(a_i-Lb_i)*x_i\)是否非负的问题是简单的,由于\(a_i-Lb_i\)的值可以直接计算,所以直接取适当的\(x_i\),让上式最大化或最小化即可。

Dropping Test

Description

给定你n组ai,bi,让你取出n?k组,使得这n?k组的a之和除以b之和最大.

Input Format

输入包括多组数据.

每组数据第一行包括两个数n和k,意义如题,若n和k为0表示输入结束.

接下来一行n个数,第i个数表示ai.再接下来一行n个数,第i个数表示bi.

Output Format

对于每组输入数据输出一行一个数表示答案,答案保留整数.

Sample Input

3 1
5 0 2
5 1 6
4 2
1 2 7 9
5 6 7 9
0 0

Sample Output

83
100

解析

\(0/1\)分数规划模板题,直接二分答案,然后暴力排序判定即可。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+20;
const double eps=1e-7;
int n,k,ans;
double a[N],b[N],val[N];
inline void input(void)
{
    for (int i=1;i<=n;i++)
        scanf("%lf",&a[i]);
    for (int i=1;i<=n;i++)
        scanf("%lf",&b[i]);
}
inline double check(double L)
{
    double res = 0.0;
    for (int i=1;i<=n;i++)
        val[i] = a[i] - L * b[i];
    sort( val+1 , val+n+1 );
    for (int i=n;i>=k+1;i--)
        res += val[i];
    return res;
}
inline void fraction_planning(void)
{
    double l=0.0,r=1.0,mid;
    while ( l + eps < r )
    {
        mid = (l+r) / 2;
        if (check(mid)>=0)l=mid;
        else r=mid;
    }
    ans = (int)(mid*100+0.5);
}
int main(void)
{
    while ( scanf("%d%d",&n,&k) && (n|k) )
    {
        input();
        fraction_planning();
        printf("%d\n",ans);
    }
    return 0;
}


『0/1分数规划 二分法』

原文地址:https://www.cnblogs.com/Parsnip/p/10742572.html

时间: 2024-10-31 00:53:04

『0/1分数规划 二分法』的相关文章

[例题/总结]0/1分数规划

[TOC] ##一.总述 0/1分数规划是专门解决0/1分数规划模型的一种算法~~(废话)~~.所以说0/1分数规划模型是什么呢?给定整数{\(a_1,a_2,a_3,...,a_n\)},{\(b_1,b_2,b_3,...,b_n\)}从中选出若干对数,使得它们各自和的比值最大.公式如下: \(\frac{\sum_{p=1}^{n}a_p\times x_p}{\sum_{p=1}^{n}b_p\times x_p}(x_p=1,0)\) ##二.实现原理 那么我们用什么方法可以求出这样一

bzoj 3232 圈地游戏——0/1分数规划(或网络流)

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为边围成的形状像一个环,所以把格子的贡献也放到边上,然后正常判环. 放到边上的方法就是:比如竖着的边,可以在每一行上维护该行格子值前缀和,然后指定那个围成的形状是,比如,逆时针的,那么向上的边就加上到它为止的前缀值,向下的边就减去到它为止的前缀值,然后就能判环了! 这样一定只有一个环.但多个环答案不会

0/1分数规划

学习了lyd书上的0/1分数规划,发现这类题目都有一个特点,就是求$\frac{\sum_{a_{i}*x_{i}}}{\sum_{b_{i}*x_{i}}}$的最大或者最小,再加一些限制取不取的条件. POJ2976 二分答案+sort取前(n-k+1)个. #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; con

POJ - 2976 Dropping tests &amp;&amp; 0/1 分数规划

POJ - 2976 Dropping tests 你有 \(n\) 次考试成绩, 定义考试平均成绩为 \[\frac{\sum_{i = 1}^{n} a_{i}}{\sum_{i = 1}^{n} b_{i}}\] 你可以考虑放弃 \(K\) 次成绩, 求最大平均成绩 * 100 小插曲: 被精度卡成喜羊羊 0/1分数规划\(from\)人生导师 Solution 01分数规划(不是很)裸题, 在每次 \(check\) 时, 选取较大的 \(num - K + 1\) 次即可 Code #

2019.4.9 一题——概率期望+0/1分数规划+最大权闭合子图

没注意 “第 x 条边和第 y 条边的起点是相同的” 的限制.没想出来. 有这个限制,可以考虑每个点分别计算.令 \( f[i] \) 表示从 i 出发的最大边数期望,那么先把拓扑序在自己之后的点的 \( f[ ] \) 算出来,然后考虑自己这个点的出边怎么做能使自己的 \( f[ ] \) 最大. \( f[i]=\frac{ \sum f[j]+1 }{ d } \) ,其中 d 是保留下来的边数, j 是保留边指向的点. 如果把 \( f[ ]+1 \) 看做收益, 1 看做代价,那么这个

Yougth的最大化(好题,二分查找 0 1分数规划)

Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi.(1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出 输出使得单位价值的最大值.(保留两位小数) 样例输入 3 2 2 2 5 3 2 1 样例输出 0.75 1 #in

POJ 3621(0/1分数规划,二分) Sightseeing Cows

题意 给一个n个点m条边的图,每一个点和每一条边都有权值.现在要找一个环的点权和/边权和最大,求这个最大值. 思路 SPFA+二分 题目的关系式:点权和/边权和 <= ans 转换一下就变成 ans*边权和 - 点权和 >= 0; 二分答案,然后用SPFA去check是否存在一个负权回路. 参考code: /* #pragma warning (disable: 4786) #pragma comment (linker, "/STACK:0x800000") */ #in

POJ3111 K Best —— 01分数规划 二分法

题目链接:http://poj.org/problem?id=3111 K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 11380   Accepted: 2935 Case Time Limit: 2000MS   Special Judge Description Demy has n jewels. Each of her jewels has some value vi and weight wi.

0/1 分数规划

模型: 给定整数 \(v_i, c_i\),规定 \(x_i=0\) 或 \(1\),存在一组解 \(\{x_i\}\),使得 \(\displaystyle \frac{\sum_{i=1}^{n} v_ix_i}{\sum_{i=1}^{n} c_ix_i}\) 最大. 解法: 最大化 \(\displaystyle \frac{v_i}{c_i}\)(即性价比)的贪心方法不可行. \(\displaystyle \frac{\sum_{i=1}^{n} v_ix_i}{\sum_{i=1}