algorithm - 获取 k 个整数,使得列表之和的比率最大
问题描述
给定 2 个长度为 N 的整数数组 a 和 b,其中 a[i] 表示第 i 个建筑物的面积,b[i] 表示第 i 个建筑物的价格,选择 k 个建筑物,使得这些建筑物的价格/这些建筑物的面积总和(总价格与总面积的比率)是最大值。
有人可以提出解决这个问题的方法吗?我在测试中得到了这个并且无法解决它。
解决方案
为了解决这个问题递归,当您位于数组的第 i 个索引处时,您可以选择该建筑物并考虑其价格和面积以获得最终答案,或者您可以忽略该建筑物并移至下一个索引。
因此,每当我们选择任何建筑物时,都会增加area_till_now
当前建筑物的面积并增加当前建筑物price_till_now
的价格并减少remaining_k
1。
(0-based indexing)
double ans=0;
void recur(int current_index,double price_till_now,double area_till_now,int remaining_k){
// we have selected k buildings.
// so simply find the ratio and update maximum answer possible
if(remaining_k==0){
double ratio=price_till_now/area_till_now;
ans=max(ans,ratio);
return;
}
// if we reach end of our array,
// return as we cant select any more building
if(current_index==n)return;
// recur without selecting this building
recur(current_index+1,price_till_now,area_till_now,left);
// recur after selecting this building
recur(current_index+1,price_till_now+price[current_index],area_till_now+area[current_index],left-1));
}
由于每座建筑物都有两种选择,因此它将具有 O(2^n) 时间复杂度。
更新: - 我早期的 dp 解决方案有错误的计算。很快我将更新优化和正确的 dp 解决方案。
推荐阅读
- python - Python:打印时如何换行?
- mysql - 如何求和汇总值并获得百分比?
- routes - Kong API网关路由的目的是什么
- php - 如何使用 fputcsv 和 explode 以分隔格式获取循环数据
- spring-boot - 有什么方法可以使用 spring-boot 自定义验证来使用两个自定义错误消息?
- css - 如何在 div 上正确定位垂直方向的文本?
- julia - 在 Julia 语言中理解步骤不能是零错误?
- c# - 如何将持久性数据添加到邮件项,使其对用户不可见
- php - 你可以在php中添加和排序多个列吗?
- groovy - 公共 groovy 方法必须是公共的,编译器说