【总结】01分数规划

定义

我们给定两个数组,ai 表示 i 的价值,bi表示选取 i 的代价。如果选取 i,定义 xi=1 否则 xi=0。每个物品只有选和不选的两种方案,求一个选择的方案使得 R=(aixi)(bixi),也就是选择物品的总收益除以总代价最大或者最小。

01分数规划问题主要包含以下几个问题:

  • 一般的01分数规划
  • 最优比率生成树
  • 最优比率环

01分数规划

F(L)=(aixi)L(bixi)

可以化简得到

F(L)=(xi(aiLbi))

再用 di 替代 aiLbi

又可以得到 F(L)=(xidi)

而我们的最优解 R, 就可以通过二分得到

例题

01 分数规划

这是一道板子题

我们之前已经得到了

F(L)=(xi(aiLbi))

我们可以二分答案,二分出的 mid 就是函数中的 L, 我们就可以得到 di, 由于恰好有 Kxi1,由于我们要让 F(L)0 所以我们取 di 的前 k 大的值。

核心代码如下

bool cmp(double x, double y) {
    return x > y;
}
bool check(double m) {
    for (int i = 1; i <= n; i++)
        d[i] = 1.0 * a[i] - m * b[i];
    sort(d + 1, d + n + 1, cmp);
    double sum = 0;
    for (int i = 1; i <= k; i++)
        sum += d[i];
    return sum >= 0; 
}
while (r - l >= eps) {
double mid = (l + r) / 2;
    if (check(mid))
        l = mid;
    else
        r = mid;
}

背包问题 V3

posted @   zhou_ziyi  阅读(302)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示