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 }

浙公网安备 33010602011771号