01 分數規劃小結

2022-04-28 20:18:10 字數 1468 閱讀 6148

01分數規劃是用來解決這樣的一類問題:

有一堆物品,每乙個物品有乙個收益ai,乙個代價bi,我們要求乙個方案使選擇的∑ai/∑bi最大。

這一類問題一般都有固定套路:

我們令x=∑ai/∑bi,我們要最大化x。

稍微改變一下得到:∑(ai-bi*x)>=0。

即我們需滿足這個條件下得到最大的x。

那麼我們就可以直接二分答案,即二分這個x的值。

這就直接是乙個判定性問題了。

看一道板子:bzoj 5281 talent show

這個就是按上述套路,二分答案,再跑乙個揹包判斷一下,就好了。

#include using

namespace

std;

inline

intgi ()

while (ch>='

0' && ch<='9'

)

return w?-x:x;

}const

int n=251

;int n,w,l,r=100000

,mid,wi[n],val[n];

long

long f[100010

];bool check (int

val)

return f[w]>=0;}

intmain ()

while (lprintf (

"%d\n

", l);

return0;

}

另外一道板子:bzoj 4753 最佳團體

同理,二分答案+樹形揹包判斷。

#include using

namespace

std;

inline

intgi ()

while (ch>='

0' && ch<='9'

)

return w?-x:x;

}const

int n=2510

;const

double eps=1e-5

;int

n,k,tot,head[n],size[n];

double l,r=20000

,mid,val[n],pay[n],f[n][n];

struct

edge e[n];

inline

void make (int

from, int

to)

void dp (int

x) }

bool

check ()

intmain ()

while (r-l>=eps)

printf (

"%.3lf\n

", l);

return0;

}

可以發現(個人感覺huaji)01分數規劃是和揹包緊密相連的。。

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...