有n個物品的重量和價值分別是w[i]和v[i],從中選出k個物品使得單位重量的價值最大。
1<=k<=n<=10^4
1<=w[i],v[i]<=10^6
一般想到的是按單位價值對物品排序,然後貪心選取,但是這個方法是錯誤的,對於有樣例不滿足。我們一般用二分搜尋來做(其實這就是乙個01分數規劃)
我們定義:
條件 c(x) :=可以選k個物品使得單位重量的價值不小於x。
因此原問題轉換成了求解滿足條件c(x)的最大x。那麼怎麼判斷c(x)是否滿足?
變形:(sigma(v[i])/sigma(w[i]))>=x (i 屬於我們選擇的某個物品集合s)
進一步:sigma(v[i]-x*w[i])>=0
於是:條件滿足等價於選最大的k個和不小於0.於是排序貪心選擇可以判斷,每次判斷的複雜度是o(nlogn)。
**:#include
#include
#include
using namespace std;
const int maxn=1e4;
const double eps=1e-5;
int w[maxn],v[maxn],n,k;
double y[maxn];
bool check(double r)
int main()
printf("%.2f\n",ub);
} return 0;
}
最大化平均值
n個物品的重量和價值分別是wi和vi。從中選取k個物品使單位重量的價值最大 輸入n 3 k 2 w,v 輸出0.75 選擇0和2號物品,平均價值是 2 1 2 2 0.75 一般最先想到的方法可能是把物品按照單位價值排序,從大到小貪心的選取。但是這個方法對於樣例得到結果是5 7 0.714。實際上,...
模板 最大化平均值
給出 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...