01分數規劃學習筆記

2022-04-09 11:31:41 字數 1330 閱讀 5598

01分數規劃學習筆記

今天 gsh 帶著我們複習了一下01分數規劃。

01分數規劃就是假設乙個物體有兩個屬性 a,b,同時選擇在這個集合中的k個物品,使:

\[v=\dfrac _ a_i \cdot x_i} _ b_i \cdot x_i} ,\sum_^x_i=k

\]的值最大。

那麼如何能做到呢?看這個式子我們很難看出如何求解,那麼將其變形。

\[v \cdot \sum^ _ b_i \cdot x_i- \sum^_ a_i\cdot x_i=0

\]提取公因式

\[\sum ^_ x_i \cdot(v\cdot b_i-a_i)=0

\]那麼,我們可以二分乙個v,設乙個變數

\[c_i=(v\cdot b_i-a_i)

\]sort後選擇最大的k個,二分如下。

while(r-l>1e-5)
然後就有最優比率生成環(用spfa等等判正環),最優比率生成樹(最大生成樹)求出sumc是否大於0即可。

附一道題,poj2728,desert king,最優比率生成樹。

題目大意:有n個村莊,每個村莊有乙個高度和座標,要求建乙個生成樹,每條邊有兩個屬性是距離與代價,要求單位長度的花費最小 (代價的大小就是這兩個村莊的高度差的絕對值)。

//writer : hsz %wjmzbmr%tourist%hzwer

#include#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

int n;

const int n=1004;

int x[n],y[n],z[n];

bool vis[n];

double a[n][n],b[n][n],c[n][n],dis[n];//鄰接矩陣存圖。

double dist(int d,int e)

bool check(double v)

int main()

for(int i=1; i<=n; i++)

for(int j=1; j<=n; j++)

if(i!=j)

a[i][j]=sqrt(dist(i,j)),b[i][j]=abs(z[i]-z[j]);

double l=0,r=1e9;

while(r-l>1e-5)

printf("%.3lf\n",l);

} return 0;

}

01分數規劃 學習筆記

n 個物品選 k 個,最大化 frac a i b i 二分答案 mid 如果 sum limits 0 則可以更優 顯然是要選擇 a i mid b i 的前 k 大 最小化生成樹的 n 條邊 frac cost i,j dis i,j 一樣的做法二分答案每次求最小生成樹 然後完全圖用 krusk...

學習筆記 0 1分數規劃

對於一類 每個元素有兩個屬性a,b 選擇若干個元素,使得 frac 取到最值。這類問題可以採用二分的方法。然後構造出模型用於判定。推導 二分mid 如果mid ans,那麼存在一組解 使得 mid frac 即,存在一組解 使得 mid times sum b sum a 0 我一般喜歡變成 sum...

01分數規劃學習

真的是很差啊,這個東西弄了好久也沒看懂。主要是數學比較差的原因吧。網上把一些不等式啊啥的略了,我就mengbi了。最普通的01分數規劃是這樣乙個基本問題就像這樣吧。每個物品有乙個價值 花費 要求的是選其中 k 個,使得 r sum frac 最大。這裡的 非0即1,表示是否選取該物品。我們有乙個函式...