0/1分数规划,不妨设 L = ∑a[i] / ∑b[i] ,题目要求要让结果最大,那么就是L最大最终移相化简可得
∑a[i] - L*∑b[i] = 0,因为a 和b都是已知所以我们可以直接枚举L,当我们所求的值大于零说明L还有更优解当小于零时L没有最优解。直接二分即可
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
double a[1000004],b[1000004];
bool check(double L){
double d[100005] = {0};
for(int i = 0; i < n; i ++){
d[i] = a[i] - L*b[i];
}
sort(d , d + n);
double sum = 0;
for(int i = m; i < n ; i ++){
sum += d[i];
}
return sum >= 0;
}
int main()
{
while(cin >> n >> m , n || m){
for(int i = 0; i < n ; i ++){
cin >> a[i];
}
for(int i = 0; i < n; i ++){
cin >> b[i];
}
double l = 0,r = 1;
while( r - l > 1e-7){
double mid = (l + r)/2;
if(check(mid)){
l = mid;
}
else r = mid;
}
printf("%.0f\n",l*100);
}
}