0/1分数规划,可以不采用动态规划的方法,推导过程并不困难。
此过程严格地来叙述如下:
其综合复杂度为O(log(nM)),其中M=max{max|ai|,max|bi|,1}。
#include <iostream> #include <algorithm> using namespace std; #define eps 1e-6 int main() { int n, k; double a[1005], b[1005], score[1005]; while (cin >> n >> k && (n || k)) { for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; } double l = 0.0, r = 1.0; while (l + eps < r) { double ratio = (l + r) / 2.0; for (int i = 0; i < n; i++) score[i] = a[i] - b[i] * ratio; sort(score, score + n); double total = 0.0; for (int i = k; i < n; i++) { total += score[i]; } if (total >= 0.0) l = ratio;//在[ratio,r]里面,因为sum _{i=0 }^{ n }{ \frac { { a }_{ i } }{ { b }_{ i } }} > ratio else r = ratio;//在[l, ratio]里面,因为sum _{i=0 }^{ n }{ \frac { { a }_{ i } }{ { b }_{ i } }} < ratio } cout << (int) (l * 100 + 0.5) << endl; } } |