分数规划学习笔记
1. 用途
分数规划常用于求一个分式的极值,就是给出两个序列
通常,题目中还会有类似于
2. 解法
通常使用二分,记当前二分的值为mid
所以,在每一次check的时候,求出不等式右边的最大值判断即可,而这一部分显然可以用0/1背包完成
3. 例题
P4377 [USACO18OPEN] Talent Show G
按照上述方法二分即可,对于重量的限制可以以重量为下标,求0/1背包判断即可
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int n,w,a[255],b[255];
ll f[10005];
bool check(int x)
{
memset(f,128,sizeof(f));
f[0]=0;
ll tmp=f[w];
for(int i=1;i<=n;i++)
{
for(int j=w;j>=0;j--)
{
if(tmp==f[j]) continue;
int k=j+a[i];
k=min(k,w);
f[k]=max(f[k],f[j]+b[i]-1ll*a[i]*x);
}
}
if(f[w]>=0) return 1;
return 0;
}
int main()
{
scanf("%d%d",&n,&w);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
b[i]*=1000;
}
int l=0,r=100000;
while(l<r)
{
// printf("%d %d\n",l,r);
int mid=(l+r+1)>>1;
if(check(mid))
{
l=mid;
}
else r=mid-1;
}
printf("%d",l);
return 0;
}
分类:
学习笔记 / 数学
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律