POJ---2976(二分,最大化平均值详细讲解)
2018-02-04 15:08
429 查看
题意:
最大化平均值的模型:
有N个物品的重量和价值分别为Wi和Vi,从中选取K个物品使得单位重量的价值最大。也就是使得K个物品的ΣVi
/ΣWi最大。
使用二分搜索解决这类问题:
ΣVi /ΣWi >= x也就是Σ(Vi-x*Wi)>=0。[b]X越大,式子左边越小,一直逼到=0的边界![/b]
贪心思想去找最大的可行解x即可:对Vi-X*Wi排序,选取前K个看是否>=0!
本题也就是这个模型!
题解:
最大化可行解。
最大化平均值的模型:
有N个物品的重量和价值分别为Wi和Vi,从中选取K个物品使得单位重量的价值最大。也就是使得K个物品的ΣVi
/ΣWi最大。
使用二分搜索解决这类问题:
ΣVi /ΣWi >= x也就是Σ(Vi-x*Wi)>=0。[b]X越大,式子左边越小,一直逼到=0的边界![/b]
贪心思想去找最大的可行解x即可:对Vi-X*Wi排序,选取前K个看是否>=0!
本题也就是这个模型!
题解:
最大化可行解。
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> using namespace std; const int maxn=1005; const int INF=0x3f3f3f3f; int N,M; int w[maxn],v[maxn]; double y[maxn];//v-w*x bool cmp(double a, double b) { return a>b; } bool C(double x) { for(int i=0; i<N; i++) y[i]=v[i]-x*w[i]; sort(y,y+N,cmp); double sum=0; for(int i=0; i<N-M; i++) sum+=y[i]; return sum>=0;//从大到小选N-M个,看x是否为可行的解; } int main() { while(cin>>N>>M&&(N||M)) { for(int i=0; i<N; i++) cin>>v[i]; for(int i=0; i<N; i++) cin>>w[i]; double lb=0,ub=INF; for(int i=0; i<100; i++) { double mid=(lb+ub)/2; if(C(mid))lb=mid;//最大化可行解 else ub=mid; } printf("%.0f\n",lb*100);//POJ上G++不能%lf } }
相关文章推荐
- POJ - 2976 Dropping tests(二分查找,最大化平均值)
- POJ - 2976 Dropping tests 二分 最大化平均值
- 二分算法的应用——最大化平均值 POJ 2976 Dropping tests
- poj 2976 Dropping tests (二分搜索之最大化平均值之01分数规划)
- POJ - 2976 Dropping tests(二分搜索:最大化平均值)
- POJ 3111 K Best + poj 2976 Dropping tests (二分, 最大化平均值)
- POJ 2976 3111(二分-最大化平均值)
- 【POJ】2976 - Dropping tests 二分->最大化平均值
- POJ - 3111 K Best && POJ - 2976 Dropping tests 最大化平均值(二分||牛顿迭代)
- POJ 2976 Dropping tests(二分查找 最大化平均值)
- POJ 2976 Dropping tests 0/1分数规划问题 最大化平均值 贪心+二分
- POJ 2976 Dropping tests【二分 最大化平均值】
- POJ 2976 (最大化平均值)
- poj 3122 Pie 二分(最大化平均值)
- POJ 2976 Dropping tests——最大化平均值
- poj 2976 Dropping tests(最大化平均值)
- POJ 3111 K Best(二分——最大化平均值)
- poj 3111 K Best(二分-最大化平均值)
- poj 3111 K Best (二分搜索之最大化平均值之01分数规划)
- POJ 2976 Dropping tests(最大化平均值)