前言
笔者01分数规划入门题
这是一篇水过去的博客!
题目
讲解
01分数规划问题,即有一个形如(frac{sum a_i}{sum b_i})的式子,求最大值或者最小值
本题是求最小值,即我们要求一个最小的(x)满足(frac{sum a_i}{sum b_i}ge x)
我们将式子变形,即为(sum a_i-x*sum b_ige 0)
对于解决这类问题的方法是二分(x)
完事了
代码
bool check(double x)
{
for(int i = 1;i <= n;++ i) dp[i] = INF;
dp[0] = 0;
for(int i = 1;i <= n;++ i)
for(int j = 0;j < i;++ j)
{
double t = dp[j] + sqrt(Abs(p[i] - p[j] - L)) - x * b[i];
if(dp[i] > t) dp[i] = t,pre[i] = j;
}
return dp[n] >= 0;
}
void print(int x)
{
if(!x) return;
print(pre[x]);
Put(x,' ');
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n = Read(); L = Read();
for(int i = 1;i <= n;++ i) p[i] = Read(),b[i] = Read();
double l = 0,r = 1e6;
while(Abs(l-r) > eps)
{
double mid = (l+r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
check(l);
print(n);
return 0;
}