Yougth的最大化

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描写叙述

Yougth如今有n个物品的重量和价值各自是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?

输入
有多组測试数据

每组測试数据第一行有两个数n和k。接下来一行有n个数Wi和Vi。

(1<=k=n<=10000) (1<=Wi,Vi<=1000000)

输出
输出使得单位价值的最大值。(保留两位小数)
例子输入
3 2
2 2
5 3
2 1
例子输出
0.75

分析:

要想取得单位重量价值最大,须要在0-Max之间二分搜索。Max为随意选物品所得的单位重量最大价值。

Max = max(v[i] / w[i] | i = 0...n - 1)。

为什么Max如此取值,以下证明:

如果一对vi。wi 满足: vi / wi = max(v[i] / w[i] | i = 0......n-1),任取一对 vk。wk (k != i),则有vi / wi > vk / wk,

即:vi * wk > vk * wi 把它记为公式1。

证明:

要证的是 (vi + vk1 +...+ vk2) / (wi + wk1 +...+ wk2) <= vi / wi, (0<=k1<=k2<=n-1 && k1 != i && k2 != i),

1.当k1 = k2 = 0 时,即不添加。上式等号成立。

2.为便于证明,此处仅仅添加vk(k != i),它具有普通性。即证(vi + vk) / (wi + wk) < vi / wi,

即wi(vi + vk) < vi(wi + wk)。也就是vi * wk > vk * wi,此式即为公式1。成立!

3.当添加2......n-1 个数时也成立。

4.证毕。

对于cleck(a)若不理解见代码以下具体解释。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 5;
double x[maxn], w[maxn], v[maxn]; //全定义为double,便于计算
int n, k;
bool cleck(double a){
for(int i = 0; i < n; i++) x[i] = v[i] - a * w[i];
sort(x, x + n);
double sum = 0;
for(int i = 0; i < k; i++) sum += x[n - i - 1]; //贪心,由大到小取
return sum >= 0 ? true : false;
}
int main()
{
while(~scanf("%d%d", &n, &k)){
double Max = 0;
for(int i = 0; i < n; i++){
scanf("%lf%lf", &w[i], &v[i]);
Max = max(Max, v[i] / w[i]);
}
double L = 0, R = Max;
while(R - L > 1e-4){ //二分查找最优值
double M = (L + R) / 2;
if(cleck(M)) L = M;
else R = M;
}
printf("%.2lf\n", L);
}
return 0;
}

cleck(a)为检查单位重量价值a是否可取。若可取。需满足

(vk1 +...+ vk2) / (wk1 +...+ wk2) >= a (0<=k1<=k2<=n-1),

即vk1 +...+ vk2 >= a(wk1 +...+ wk2),

即vk1 - a * wk1 +...+ vk2 - a * wk2 >= 0

所以尽量取vki - a * wki(即代码中xi)大的才有可能满足。

最新文章

  1. 不一样的dynamic解析json 万能方法
  2. 63.Android面试题精选 (转)
  3. 使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
  4. Linux C学习笔记07--管道通信
  5. 在xib里,拖一个UIView到UITableView中作为tableHeaderView
  6. node.js 浏览器中输出 “hello world”
  7. tomcat 服务器全解
  8. 解决dispaly:inline-block 遗留间隙的问题
  9. Session中StateServer的使用方法
  10. moodle笔记之-权限api
  11. 家中路由添加静态IP映射(二)
  12. 【Eclipse】更改部署位置
  13. Git 初学
  14. Watch time
  15. java 与 CDH kafka集成
  16. 前端 --- 2 css
  17. HDOJ 1022 Train Problem
  18. 你真的会Xilinx FPGA的复位吗?
  19. 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra
  20. c++浅拷贝和深拷贝---14

热门文章

  1. [poj 1265]Area[Pick定理][三角剖分]
  2. wkhtmltopdf 生成pdf
  3. [Oracle]TRIGGER
  4. JSP简单练习-使用JDOM创建xml文件
  5. Androidclient与服务端(jsp)之间json的传输与解析【附效果图附源代码】
  6. C++ 需要返回值的函数却没有返回值的情况 单例模式
  7. shell 调用mysql 存储过程判断真假
  8. 基于visual Studio2013解决面试题之0602全排列
  9. 教会你如何编写makefile文件
  10. checkbox之checked的方法(attr和prop)区别