01分數規劃

2022-03-17 19:40:56 字數 1221 閱讀 9058

已經接觸過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[i])不小於v

那麼sigma(a[i]*x[i])/sigma(b[i]*x[i])>=v

變形 sigma(a[i]*x[i]) >= sigma(b[i]*x[i]*v)

sigma(a[i]*x[i] - b[i]*x[i]*v) >= 0

那麼我們定義乙個陣列 c[i] = a[i] - b[i]*v;

從大到小排序c[i] 再對前k個求和 如果 sigma(c[i]) >= 0說明當前的 f(v) == true;

然後我們二分答案 nlogn 複雜度

以為eps太大wa了一發很明顯的話要到小數點三位那麼我們的eps就不能是       1e-3

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn = 1e3+10

;double

a[maxn],b[maxn];

double

c[maxn];

const

double eps = 1e-4;//

卡精度

intn,k;

bool cmp(const

double x,const

double

y)bool f(double

v) sort(c,c+n);

double sum = 0.0

;

for(int i=0;i)

return sum>=0;}

bool

read()

for(int i=0;i)

return

true;}

intmain()

else

}printf(

"%.0f\n

",lb*100

); }

return0;

}

ac**

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可行 變...

0 1分數規劃

參照 有兩個數字n,k,兩個大小為n的陣列a,b,將其分成k n 包含 份,使得 r sigma ai sigma bi 最大。我們將之化成di ai r bi,求d的和,二分求出來r的最大值就行了。poj2976 01分數規劃 include include include include usi...