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,表示是否選取該物品。我們有乙個函式...