最大化平均值

2022-09-12 16:15:38 字數 1200 閱讀 8802

n個物品的重量和價值分別是wi和vi。從中選取k個物品使單位重量的價值最大

輸入n = 3

k = 2

(w, v) =

輸出0.75(選擇0和2號物品,平均價值是(2+1)/(2+2) = 0.75)

一般最先想到的方法可能是把物品按照單位價值排序,從大到小貪心的選取。但是這個方法對於樣例得到結果是5/7 = 0.714。

實際上,對於這個問題使用二分搜尋法可以很好的解決。我們定義

條件c(x):=可以選擇使單位重量的價值不小於x

因此原問題就變成求滿足c(x)的最大x。假設我們選了某個物品的集合s,那麼它們的單位重量價值為∑v

i / ∑w

i因此變成判斷是否存在s滿足下面的條件∑v

i / ∑w

i >= x,即 ∑(vi - x * wi) >= 0

因此,可以對(vi - x * wi)進行排序貪心地選取

c(x) = ((vi - x * wi)從大到小排列中的前k個的和不小於0)

每次判斷的複雜度為o(nlogn)。

1 #include 2 #include 3 #include 4

using

namespace

std;56

#define inf 1000

7#define max_n 100089

intn, k;

10int

w[max_n], v[max_n];

11double

y[max_n];

1213

//判斷是否滿足條件

14bool c(double

x)15

20 sort(y, y+n);

2122

//計算y陣列中從大到小前k個數的和

23double sum = 0;24

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

2528

return sum >= 0;29

}3031void

solve()

3240 printf("

%.2f\n

", ub);41}

4243

44int

main()

4551

solve();

52return0;

53 }

最大化平均值

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

模板 最大化平均值

給出 n 個物品的體積和價值,取 k 個物品,使得價值與體積之比最大 考慮二分答案,check x 表示檢查是否存在乙個大小為 k 的子集使得集合中物品的價值與體積之比 x 即 frac geq x 移項得 sum v i geq sum w i x 即 sum v i w i x geq 0 可以...

POJ 3111 K Best 最大化平均值

題目鏈結 click here 題目大意 有n個物品的重量和價值各自是wi和vi。從中選出k個物品使得單位重量的價值最大,輸出物品的編號 解題思路 最大化平均值的經典.參見click here include include include include include include using...