浅谈01分数规划-代码改变世界

本文深入探讨01分数规划问题,通过定义和关键点解释其与贪心算法的区别,并提供多个例题分析,包括POJ-2976Dropping tests、51nod背包问题、POJ - 2728Desert King和POJ-3621Sightseeing Cows,展示如何解决这类问题并优化性价比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅谈01分数规划

所谓01分数规划,看到这个名字,可能会想到01背包,其实长得差不多。
这个算法就是要求“性价比”最高的解。sum(v)/sum(w)最高的解。


定义

我们给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价。如果选取i,定义x[i]=1否则x[i]=0。每个物品只有选和不选的两种方案,求一个选择的方案使得R=sigma(a[i]*x[i])/sigma(b[i]*x[i]),也就是选择物品的总收益/总代价最大或者最小。

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

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

关于01分数规划的关键

F(L)=sigma(a[i]*x[i])-L*sigma(b[i]*x[i])
F(L)=sigma(a[i]*x[i]-L*b[i]*a[i])
F(L)=sigma((a[i]-L*b[i])*x[i])

我们把a[i]-L*b[i]定义为d[i],这样我们的算式就变成了以下算式。

F(L)=sigma(d[i]*x[i])

这样我们就把这个繁琐的算式变成了一个非常优美的算式。
而01分数规划就是要枚举L在求最大值或最小值的F(L)。
在实现程序的过程中,我们使用一个非常熟悉的老朋友,要求最大或最小,所以??我们就要用二分


关于为什么01分数规划不能用贪心?

(个人看法)
如果硬要贪心,那么就只有可能是算出每一个物品的性价比,在排序求出最大或者最小的性价比,在累加算出答案。

一、01分数规划算法

先设置价值数组a[i]和代价数组b[i],我们的答案为R。

R=ni=1a[i]x[i]ni=1b[i]x[i] R = ∑ i = 1 n a [ i ] ∗ x [ i ] ∑ i = 1 n b [ i ] ∗ x [ i ]

简单来说
R=valueiweighti R = ∑ v a l u e i ∑ w e i g h t i

我们可以发现,R的大小与上下的总值有关。

二、贪心算法

我们反观一下贪心算法,先算出每个

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值