思路分析:
二分+01分数规划。
挑战程序设计竞赛P114-P145有详细的分析,不过多赘述。

Code:

#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define MaxN 10010
typedef long long LL;
int C[MaxN],V[MaxN];
double A[MaxN];
int n,k;
bool cmp(double _A,double _B){
    return _A > _B;
}
bool check(double x){  
    for(int i=0; i<n; i++) A[i]=V[i]-x*C[i];
    sort(A,A+n,cmp);;
    double sums=0.0;
    for(int i=0; i<k; i++) sums+=A[i];
    return sums>=0;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while( T-- ){
        cin>>n>>k;
        for(int i=0; i<n; i++) cin>>C[i]>>V[i];//花费 价值
        double _left=0, _right=MaxN;
        for(int i=0; i<100; i++){
            double mid=( _left + _right )/2.0;
            if( check(mid) ) _left=mid;
            else _right=mid;
        }
        printf("%d\n",(int)_left);
    }
    return 0;
}