有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 最大 結果要求四捨...