有n個物品,每個物品分別對應乙個重量和價值。要求選出k個,使得平均每單位重量的價值最大。
思路:設k的集合是s ,使得平均值最大,即 vs/ws 最大。列舉答案x,vs/ws>=x,即 vs – ws*x>=0 成立。二分x即可。
**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 100000;
const
double inf = 1e9;
int n, k;
struct node
p[maxn];
bool cmp2(double a, double b)
double tmp[maxn];
int c(double x)
sort(tmp,tmp+n,cmp2);
double sum = 0;
for (int i = 0; i < k; i++)
sum += tmp[i];
if (sum >= 0) return
1; return0;}
void solve()
printf("%.3lf",down);
}int main()
return
0;
}
最大化平均值 二分法
n個物品重量價值分別為wi,vi 取k個值使得單位重量的價值最大。輸入 n k 接下來n行表示重量 接下來n行表示價值 分析 貪心是錯的。使的vi wi最大 假設單位重量的最大價值為x。則vi wi x 即vi wi x 0 所以按照上面公式排序二分求解。include include includ...
二分法 最大化平均值
摘自 挑戰程式設計競賽 和最大化最小值類似,最大化平均值也可以通過二分法求得。比如下面這個經典的問題 有n個物品的重量和價值分別是wi和vi,從中選出k個物品使得單位重量價值最大。樣例輸入 3 22 2 5 32 112 34樣例輸出 0.75 1分析 一般先想到的是將每個物品的單位重量價值算出來,...
最大化平均值
有n個物品的重量和價值分別是w i 和v i 從中選出k個物品使得單位重量的價值最大。1 k n 10 4 1 w i v i 10 6 一般想到的是按單位價值對物品排序,然後貪心選取,但是這個方法是錯誤的,對於有樣例不滿足。我們一般用二分搜尋來做 其實這就是乙個01分數規劃 我們定義 條件 c x...