程式設計題 最大化平均值 二分搜尋

2021-06-28 17:30:54 字數 1089 閱讀 5286

有n個物品的重量和價值分別為wi

,vi ,從中選取k個物品,使得單位重量的價值最大

輸入:

n=3

k=2

(w,v)=

輸出

0.75(選0號和2號 ( 2 + 1)/( 2 + 2) = 0.75)

首先想到的方法是先把物品按照單價排序,再從大到小進行選取。但是這樣選出來的不一定是最優的,例如上面的案例,如果按照貪心演算法 應該是選擇 0號和1號, 結果為(2+3)/(2+5)=0.714。所以這個方法是不行的。

對於這個問題,使用二分搜尋法可能很好的解決。我們定義: 條件

c(x)

:= 可以選擇使得單位重量的價值不小於x

因此,原問題就變成了求滿足c(

x)的最大的x。

怎麼判斷c(

x)是否可行呢?即判斷是否∑i

∈kvi

/∑i∈

kwi≥

x 把這個不等式變形就得到∑i

∈k(v

i−x×

wi)≥

0 因此,原來的c(

x):=v

i−x×

wi從大到小排列,然後選出前k個的和大於等於0

#include 

#include

#include

using

namespace

std;

bool c(double x,int n,int k,int* w,int* v)

return sum>=0;

}int main()

for(int i=0;icin>>v[i];

if(max_valuedouble lb=0,ub=max_value;

for(int i=0;i < 100;i++)

delete w,v;

printf("%.2f\n",ub);

}

n = 3

k = 2

2 5 2

2 3 1

0.75

最大化平均值

有n個物品的重量和價值分別是w i 和v i 從中選出k個物品使得單位重量的價值最大。1 k n 10 4 1 w i v i 10 6 一般想到的是按單位價值對物品排序,然後貪心選取,但是這個方法是錯誤的,對於有樣例不滿足。我們一般用二分搜尋來做 其實這就是乙個01分數規劃 我們定義 條件 c x...

最大化平均值

n個物品的重量和價值分別是wi和vi。從中選取k個物品使單位重量的價值最大 輸入n 3 k 2 w,v 輸出0.75 選擇0和2號物品,平均價值是 2 1 2 2 0.75 一般最先想到的方法可能是把物品按照單位價值排序,從大到小貪心的選取。但是這個方法對於樣例得到結果是5 7 0.714。實際上,...

POJ 2976 二分搜尋 最大化平均值

傳送門 1 poj 2976 dropping tests 題解 挑戰程式設計競賽 2 poj 2976 3111 二分 最大化平均值 有 n 們課程,第 i 門課程的得分和總分分別為 ai 和 bi 讓你從中選出 n k 門課程,使得 100 cdot frac a i b i 最大 結果要求四捨...