额,这个题j就是典型的01分数规划+二分
题目中要求求 总价值/总花费
思路:
设 总价值/总花费=x,那么总价值=总花费*x
即
这个x,就需要我们二分去找了
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + 4;
const int INF = 0x3f3f3f3f;
int n, k;
double w[maxn];
int c[maxn], v[maxn];
bool judge(double mid) {
for (int i = 1;i <= n;i++)
w[i] = v[i] - mid * c[i];
sort(w + 1, w + n + 1, greater<double>());
double sum = 0;
for (int i = 1;i <= k;i++)
sum += w[i];
return sum > 0;//if sum<0,证明X太小了,else 太大了
}
int main() {
int T;cin >> T;
while (T--) {
cin >> n >> k;
for (int i = 1;i <= n;i++)
cin >> c[i] >> v[i];
double l = 0, r = INF;
for (int i = 1;i <= 100;i++) {//二分查找题解中的X
double mid = (l + r) / 2;
if (judge(mid)) l = mid;
else r = mid;
}
cout << (int)r << endl;
}
return 0;
}