真的是很差啊,這個東西弄了好久也沒看懂。主要是數學比較差的原因吧。
網上把一些不等式啊啥的略了,我就mengbi了。
最普通的01分數規劃是這樣乙個基本問題就像這樣吧。
每個物品有乙個價值$_$,花費$_$。要求的是選其中$k$個,使得
$r=\sum \frac_*_}_*_}$
最大。這裡的$_$非0即1,表示是否選取該物品。
我們有乙個函式$f(t)=\sum (_*_)-t\times \sum (_*_)$,假設我們能在可接受的複雜度內求出是否有一種$_$的取值,能使得$f(t)\geq 0$。
由$f(t)$的定義式及$f(t)\geq 0$的條件,經過簡單的移項可得$\sum \frac_*_}_*_}\geq t$
又由$r$的定義式,上式左邊不就是$r$嗎?!所以只要存在$f(t)\geq 0$,我們就能知道是存在一種$_$的取值能讓$r$大於等於$t$的。
顯然在滿足存在$_$使得$f(t)\geq 0$的條件下,$t$的取值越大,我們就越逼近$r$的最大值。當我們找不到一種$_$的取值能讓$f(t)\geq 0$時,就說明$r$是不能大於等於$t$的。
所以得出:當我們找到這樣乙個$t$,它本身可行但再大一點就找不到$_$取值集合能讓$f(t)\geq 0$,那麼可以認為,$t$就是我們要求的$r$的最大值。顯然這是可以二分解決的。
那麼問題只剩下了,如何判定是否存在$_$取值集合能讓$f(t)\geq 0$??
由$\sum $的性質,我們求出每個物品的
$_-t*_$,想讓$f(t)$盡量大且只能選$k$個,就選$_-t*_$最大的前$k$個,自然就使得$f(t)$最大了!
問題至此就解決了。二分$t$,每次判定$f(t)$是否可能大於等於0,可以的話提高下界,否則降低上界。結果即所求。
0 1分數規劃
題目鏈結 中文鏈結 附一篇大佬部落格感覺講的不錯 0 1分數規劃,不妨設 l a i b i 題目要求要讓結果最大,那麼就是l最大最終移相化簡可得 a i l b i 0,因為a 和b都是已知所以我們可以直接列舉l,當我們所求的值大於零說明l還有更優解當小於零時l沒有最優解。直接二分即可 inclu...
01分數規劃
01分數規劃,就是這樣乙個東西 max frac 其中 xi in 簡而言之,就是在n個物品中選出任意幾個 或者可以有限制選多少個 使得其兩種權值a,b的比值最大 這樣的問題可以二分解決 假如有這樣一道裸題 poj2976,選n k個物品使得比值最大 我們二分出r,若存在 frac r 則r可行 變...
01分數規劃
已經接觸過01分數規劃但是只知道二分寫法 實際求解略慢 dinkelbach演算法還是值得一學的。上一道裸的01分數規劃吧。poj x陣列代表我們選或者不選 0,1構成 r sigma a i x i sigma b i x i 變形 設f v 為 sigma a i x i sigma b i x...