01分数规划 —— 入门介绍

本文介绍了01分数规划的基本概念和解决方法,包括问题定义、二分法求解,并详细探讨了最优比率生成树问题,特别是Dinkelbach算法的应用,提供相关例题和C++代码实现。
摘要由CSDN通过智能技术生成

01分数规划

问题介绍

01分数规划是大家学习之路上较为经典的一类问题,首先对于这个名字,01的含义一般来说就是“选与不选”,问题原型如下

当前有n个物品,每个物品都有其价值 v i v_i vi 与成本 w i w_i wi,要求我们从中选出k(k<=n)个物品,使得总价值与总成本的比例最大(最小),也就是对于选出的这k个物品
1 < = j < = k 1 <= j <= k 1<=j<=k
∑ 1 k v j / ∑ 1 k w j \sum_1^k{v_j} / \sum_1^k{w_j} 1kvj/1kwj 最大(最小),求这个最值

  • PS:对于这个问题,网上有些介绍可能少了其中的“k个”,而是描述为“选一些”,当然这样可能更加宽泛,但是容易出现误解,我一开始就误以为“一些”是”任意个“的意思,结果发现这样想的话,只用选性价比最高的那个物品就行了,显然这样是不行的

解决方法/算法过程

  • 1.式子变形

一开始要对这个式子进行变形,以最大值为例,设答案为 a n s ans ans 则在选出的k个中有:
∑ 1 k v j / ∑ 1 k w j ≤ a n s \sum_1^k{v_j} / \sum_1^k{w_j} \le ans 1kvj/1kwjans


∑ 1 k v j ≤ a n s ∗ ∑ 1 k w j \sum_1^k{v_j} \le ans * \sum_1^k{w_j} 1kvjans1kwj


∑ 1 k v j − a n s ∗ ∑ 1 k w j ≤ 0 \sum_1^k{v_j} - ans * \sum_1^k{w_j} \le 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值