首页 > 其他分享 >分数规划

分数规划

时间:2024-07-22 21:53:54浏览次数:6  
标签:分数 sum mid times 权值 规划

分数规划

转载自 分数规划 - OI Wiki

模板

给定 \(n\) 和 \(a_i,b_i\), 求一组 \(w_i \in 0,1\), 最小化或最大化

\[\frac{\sum_{i=1}^{n}{a_i\times w_i}}{\sum_{i=1}^{n}{b_i\times w_i}} \]

  • 求解:

二分一个答案 \(mid\), 考虑如何判定 \(\frac{\sum_{i=1}^{n}{a_i\times w_i}}{\sum_{i=1}^{n}{b_i\times w_i}} > mid\), 推导后得:

\[\sum w_i \times(a_i-mid \times b_i) > 0 \]

将 \(w_i \times(a_i-mid \times b_i\) 作为第 \(i\) 个数的权值, 最后统计时只选正的即可(<0 就只选负的)

最后看总和是否 \(>0\) 即可.

SOJ 烧结核凝晶

规定只能选其中 \(k\) 个.

  • 求解:没有太大变化,选前 \(k\) 个即可.

洛谷 4377 Talent Show (限制分母)

要求 \(\sum w_i \times b_i \ge W\)

无法直接贪心了

W较小,考虑01背包,以 \(b_i\) 作重量 \(w_i \times(a_i-mid \times b_i\) 作权值,最后看 \(f[W]\) 的正负.

注意:\(\sum w_i \times b_i\) 可能超过 \(W\), 此时可直接视为 \(W\), 相当于把合法的全部算到一起了.

POJ2728 Desert King(树上规划)

把 \(a_i-mid \times b_i\) 作为每条边的权值,那么最小生成树就是最小值.

[HNOI2009] 最小圈(图上规划)

把 \(a_i-mid\) 作为边权,那么权值最小的环就是最小值。只需要判断其总和是否小于0即可

相当于看有没有负权环(SPFA)

总结

分数规划问题是一类既套路又灵活的题目,一般使用二分解决。

分数规划问题的主要难点在于推出式子后想办法求出 \(\sum w_i \times(a_i-mid \times b_i)\) 的最大值/最小值,而这个需要具体情况具体分析。

标签:分数,sum,mid,times,权值,规划
From: https://www.cnblogs.com/superl61/p/18317018

相关文章

  • 【动态规划】【官解+整洁度优化+状态压缩-空间优化算法】力扣198.打家劫舍
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜......
  • 编辑距离与滚动数组优化 - 二维动态规划模板
    题目:编辑距离。思路显然,定义\(f[i][j]\)表示字符串\(a\)中前\(i\)个字符到字符串\(b\)中前\(j\)个字符的编辑距离。那么对于\(a_i=b_j\)时,我们对当前位无需进行任何编辑操作,则\(f[i][j]=f[i-1][j-1]\)。如果\(a_i\neb_j\),那么我们就要对当前位进行编辑:......
  • 最长不降子序列 n log n 方案输出与 Dilworth 定理 - 动态规划模板
    朴素算法不必多说,\(O(n^2)\)的暴力dp转移。优化算法时间为\(O(n\logn)\),本质是贪心,不是dp。思路是维护一个单调栈(手写版),使这个栈单调不降。当该元素\(\ge\)栈顶元素时,把这个元素压入栈中。否则,在单调栈中找到第一个大于该元素的项,把这一项改为这个元素。(因为要......
  • 代码随想录算法训练营第36天 | 动态规划基础2:62.不同路径、63.不同路径 II
    62.不同路径https://leetcode.cn/problems/unique-paths/submissions/548656029/代码随想录https://programmercarl.com/0062.不同路径.html63.不同路径IIhttps://leetcode.cn/problems/unique-paths-ii/description/代码随想录https://programmercarl.com/0063.不同路径......
  • 力扣-动态规划全解
    目录动态规划斐波那契数列-EASY爬楼梯-EASY使用最小花费爬楼梯-EASY不同路径-Middle不同路径II-Middle不同路径III-HARD整数拆分-MID*不同的二叉搜索树-MID背包问题-理论基础分割等和子集-EASY最后一块石头的重量II-MID目标和-MID*一和零-MID*53-最大子数组和-中等918-环形子数......
  • (7-4-03)RRT算法:基于Gazebo仿真的路径规划系统(3)
    (6)函数select_branch实现了RRT_*_FND算法中的选择分支策略,用于删除不再位于路径上的节点及其子节点。它接收当前达到的节点以及先前的路径作为输入,并根据路径更新图中的节点和边。随着节点的移除,函数会实时显示图的变化。最后,它返回更新后的路径。defselect_branch(G:Graph,......
  • 图解动态规划
    总结自:10分钟彻底搞懂“动态规划”算法下面用实例讲解什么是动态规划算法(DynamicProgramming,DP)。首先我们来看一个经典的动态规划问题。输入一个无序的数组,要求找出其中最长的递增的子序列。如:对于[1,5,2,4,3],其最长递增子序列为1,2,4、1,2,3。但这里我们对这个问题......
  • 代码随想录算法训练营第35天 | 动态规划1:509.斐波那契数、70.爬楼梯、746.使用最小花
    代码随想录算法训练营第35天|动态规划理论基础https://programmercarl.com/动态规划理论基础.html#算法公开课509.斐波那契数https://leetcode.cn/problems/fibonacci-number/submissions/548309803/代码随想录https://programmercarl.com/0509.斐波那契数.html#算法公开......
  • 动态规划-1:穷举遍历->map缓存->取消递归
    importjava.util.HashMap;importjava.util.Map;publicclassDynamicProgrammingAlgorithm{publicstaticvoidmain(String[]args){//比如要求一个数组的最长递增子序列的长度//比如是[1,4,2,5,3],那么[1,2,5],或者[1,2,3]都是最长递增子序......
  • 动态规划2:计算最大连续子序列和
    importjava.util.HashMap;importjava.util.Map;publicclassDynamicProgramming2{publicstaticvoidmain(String[]args){int[]arr={3,-4,2,-1,2,6,-5,4};//暴力枚举法System.out.println(getMaxSumSubArr(arr));//加......