POJ 2976 01分數規劃

2021-06-06 00:40:30 字數 1191 閱讀 4855

剛做完了最優比率生成樹   就瞬間來了感覺了

題目大意就 給定n個二元組(a,b),扔掉k個二元組,使得剩下的a元素之和與b元素之和的比率最大

題目求的是 max(∑a[i] * x[i] / (b[i] * x[i]))  其中a,b都是一一對應的。 x[i]取0,1  並且 ∑x[i] = n - k;

那麼可以轉化一下。  令r = ∑a[i] * x[i] / (b[i] * x[i]

)  則必然∑a[i] * x[i] - 

∑b[i] * x[i] * r= 0;(條件1)

並且任意的 

∑a[i] * x[i] - ∑b[i] * x[i] * max(r) <= 0  (條件2,只有當∑a[i] * x[i] / (b[i] * x[i]

) = max(r) 條件2中等號才成立)

然後就可以列舉r , 對列舉的r, 求q(r) = ∑a[i] * x[i] - 

∑b[i] * x[i] * r  的最大值,  為什麼要求最大值呢?  因為我們之前知道了條件2,所以當我們列舉到r為max(r)的值時,顯然對於所有的情況q(r)都會小於等於0,並且q(r)的最大值一定是0.而我們求最大值的目的就是尋找q(r)=0的可能性,這樣就滿足了條件1,最後就是列舉使得q(r)恰好等於0時就找到了max(r)。而如果能q(r)>0 說明該r值是偏小的,並且可能存在q(r)=0,而q(r)<0的話,很明顯是r值偏大的,因為max(r)都是使q(r)最大值為0,說明不可能存在q(r)=0了,需要換方向搜尋了、 

然後演算法框架就出來了。

二分列舉r。對每個r。求出每個a[i] - b[i] * r; 然後排序,將最大的n-k個相加即為最q(r)的最大值。

#include #include #include #include #include #include #include #define maxn 1005

#define inf 1000000000

#define eps 1e-7

using namespace std;

int n, k;

double a[maxn], b[maxn], t[maxn];

double get(double mid)

int main()

printf("%.0f\n", l * 100);

}return 0;

}

POJ2976 0 1分數規劃

include include include include using namespace std const int maxn 1000 5 const double eps 1e 7 struct node n maxn bool cmp node u,node v int n,k bool...

POJ 2976 01分數規劃基礎題目

題意 給你一組 數 一共n個,每個數有兩個權值,價錢a i 代價b i 讓你選擇n k使得 sigma a i sigma b i 100 最大 思路 毫無疑問這個是01分數規劃的最進本形式,唯一的限制就是取個數,那麼我們直接sort以下,取出來就行了。沒啥解釋的,這個是自己的第乙個01分數規劃,一...

POJ 3621 01分數規劃

題意 給出乙個有向圖,問求乙個迴路,使得回路上的點權之和 邊權之和最大。題解 01分數規劃,簡單構造,將點權轉移到邊權上 因為乙個環上的點和邊的數量是相等的 設i,j之間初始邊權為w i j 修改後的邊權為g i j 則g i j w i j mid val i spfa判負環即可 01分數規劃詳見...