最大化平均值

题目:《挑战程序设计》P143

有 n 个物品的重量和价值分别是 wi 和 vi 。从中选出 k 个物品使得单位重量的价值最大

1<=k<=n<=10^4

1<=w[i],v[i]<=10^6


思路:二分

设最后选定物品的集合为S

用 sigma(i in S) V[i]   所有的价值和

用 sigma(i in S) W[i]  所有的质量和

ans = sigma(i in S) V[i] /  sigma(i in S) W[i]

根据化简得到:

sigma(v[i] - ans*w[i] ) >=0 那么我们就二分这个就行 


Input :

3 2

2 2

5 3

2 1

Output:

0.75


#include <cstring>
#include <cmath>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
using namespace std;
#define maxn 10010
double w[maxn],v[maxn],c[maxn];
int n,k;
bool ok(double ans)
{
    for(int i=0;i<n;i++)
        c[i]=v[i]-ans*w[i];
    sort(c,c+n);
    double cnt=0;
    for(int i=0;i<k;i++)
        cnt+=c[n-1-i];
    return cnt>=0;
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%lf%lf",&w[i],&v[i]);
    double l=0,r=1000010;
    while(abs(l-r)>1e-6)
    {
        double mid=(l+r)/2;
        if(ok(mid))
            l=mid;
        else
            r=mid;
    }
    printf("%.2lf\n",r);
    return 0;
}


### 平均值最大化的理论基础 平均值通常用于衡量一组数据的增长率或变化趋势,其定义为 \( n \) 个正数乘积的第 \( n \) 次方根。为了使平均值最大化,在给定约束条件下,可以通过优化方法调整变量之间的关系来达到目标。 对于多个变量的情况,如果总和固定,则这些变量相等时平均值会取得最大值[^1]。这一结论基于均值不等式(AM-GM 不等式),即算术平均大于等于何平均,当且仅当所有数值相等时取到等号。 --- ### 编程实现平均值最大化 以下是通过 Python 实现的一个简单例子,假设我们有若干个正数,它们的总和固定为某个常量 \( S \),求解使得何平均最大的分配方式: #### 方法描述 设 \( x_1, x_2, ..., x_n \) 是 \( n \) 个正数,满足条件: \[ x_1 + x_2 + ... + x_n = S, \] 其中 \( S \) 是固定的正值。要让平均值最大化,需令 \( x_i = \frac{S}{n} \) 对于所有的 \( i=1,...,n \)。 #### 示例代码 下面是一个简单的 Python 脚本,演示如何找到最优解并验证结果: ```python import numpy as np def maximize_geometric_mean(total_sum, num_variables): """ 计算在固定总和下,各变量相等时的平均值。 参数: total_sum (float): 变量之和的固定值。 num_variables (int): 变量的数量。 返回: float: 最大化后的平均值。 """ if num_variables <= 0 or total_sum <= 0: raise ValueError("总数和变量数量必须为正数") optimal_value_per_variable = total_sum / num_variables geometric_mean_maximized = optimal_value_per_variable ** (num_variables / num_variables) return geometric_mean_maximized, [optimal_value_per_variable] * num_variables # 测试函数 total_sum_example = 100 # 总和固定为 100 number_of_variables = 5 # 假设有 5 个变量 max_geo_mean, variable_values = maximize_geometric_mean(total_sum_example, number_of_variables) print(f"最大平均值: {max_geo_mean}") print(f"每个变量的最佳值: {variable_values}") ``` 上述代码实现了如下功能: - 输入总和 `total_sum` 和变量数目 `num_variables`; - 输出每种情况下最佳的单个变量值以及对应的平均值。 --- ### 结果分析与解释 运行以上程序后可以看到,当所有变量都设置成相同的值 (\( \frac{\text{{total\_sum}}}{\text{{num\_variables}}} \)) 时,得到的结果正是该组数据可能获得的最大平均值。 需要注意的是,这种方法只适用于加法约束下的最优化问题;如果是其他类型的约束或者更复杂的多维空间中的寻优,则需要用到更加高级的技术比如拉格朗日乘子法或其他数值优化工具包来进行解决。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值