01分數規劃是用來解決這樣的一類問題:
有一堆物品,每乙個物品有乙個收益ai,乙個代價bi,我們要求乙個方案使選擇的∑ai/∑bi最大。
這一類問題一般都有固定套路:
我們令x=∑ai/∑bi,我們要最大化x。
稍微改變一下得到:∑(ai-bi*x)>=0。
即我們需滿足這個條件下得到最大的x。
那麼我們就可以直接二分答案,即二分這個x的值。
這就直接是乙個判定性問題了。
看一道板子:bzoj 5281 talent show
這個就是按上述套路,二分答案,再跑乙個揹包判斷一下,就好了。
#include usingnamespace
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 usingnamespace
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...