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 4using
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...