最大化平均值

2021-12-29 16:30:18 字數 725 閱讀 1249

有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...