2022.2.26#01分数规划(二分)和(Dinkelbach)

 

这个算法就是要求性价比最高,即value/cost最高的解。

二分法代码:如上啦

Dinkelbach的方法是对fmax时直接把r移动到当前所交函数图像的零点去:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #define ll long long
 5 using namespace std;
 6 typedef struct frr {
 7     double s;
 8     int index;
 9 };
10 int cmp(frr a, frr b)
11 {
12     return a.s > b.s;
13 }
14 int main(void)
15 {
16     int n, k;
17     double r, left, right;
18     ll a[1010], b[1010],a_sum,b_sum;
19     double frmax=0;
20     frr fr[1010];
21     while (1)
22     {
23         cin >> n >> k;
24         if (n == 0&&k==0)
25             break;
26         for (int i = 0;i < n;i++)
27             scanf("%lld",&a[i]);
28         for (int i = 0;i < n;i++)
29             scanf("%lld", &b[i]);
30         r = 0;
31         while (1)
32         {
33             a_sum = 0;
34             b_sum = 0;
35             frmax = 0;
36             for (int i = 0;i < n;i++)
37             {
38                 fr[i].s = (double)-b[i] * ((double)r) + (double)a[i];
39                 fr[i].index = i;
40             }
41             sort(fr, fr + n, cmp);
42             for (int i = 0;i < n-k;i++)
43             {
44                 a_sum += a[fr[i].index];
45                 b_sum += b[fr[i].index];
46             }
47             frmax = (double)-b_sum * ((double)r ) + (double)a_sum;
48                 r = (double)a_sum /(double) b_sum;
49                 if (fabs(frmax) <0.001)
50                     break;
51         }
52         r *= 100;
53         if ((r - (int)r) >= 0.49999)
54             r++;
55         printf("%d\n",(int)r);
56     }
57 }

 

posted @ 2022-02-26 17:27  Tiachi  阅读(175)  评论(0)    收藏  举报