Solution
设 ,。若 ,则 。又因为 ,移项得。
因此对于选定的 个 ,从内到外 应升序排列。
我们对 个函数以 为关键字升序排序,用 01 背包求解即可。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5 + 10;
ll n, k, f[N];
struct Node {
ll a, b;
friend bool operator < (const Node &a, const Node &b) {
return (a.a - 1) * b.b < (b.a - 1) * a.b;
}
} a[N];
int main()
{
scanf("%lld%lld", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%lld%lld", &a[i].a, &a[i].b);
sort(a + 1, a + 1 + n);
f[0] = 1;
for (int i = 1; i <= n; i++)
for (int j = k; j; j--)
f[j] = max(f[j], a[i].a * f[j - 1] + a[i].b);
printf("%lld", f[k]);
return 0;
}