#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 5e3 + 10,maxw = 1e4 + 10;
int n,W,k,chk;
int v[N],w[N];
ll maxv;
ll dp[2][maxw][N];
ll check(ll a,ll b,ll c){
ll x[] = {0,a,b,c};
for (int i = 1;i <= 3;i++){
for (int j = 1;j < 3;j++){
if (x[j] < x[j + 1])swap(x[j],x[j + 1]);
}
}
return x[1];
}
void printt(int i){
cout << '\n';
cout << i << ":\n!chk:\n";
for (int l = 0;l <= k;l++){
for (int j = 0;j <= W;j++){
cout << dp[!chk][j][l] << ' ';
}
cout << '\n';
}
cout << "\nchk:\n";
for (int l = 0;l <= k;l++){
for (int j = 0;j <= W;j++){
cout << dp[chk][j][l] << ' ';
}
cout << '\n';
}
cout << '\n';
}
int main(){
// freopen("A.in","r",stdin);
// freopen("A.out","w",stdout);
cin >> n >> W >> k;
for (int i = 1;i <= n;i++){
cin >> w[i] >> v[i];
}
chk = 1;
for (int i = 1;i <= n;i++){
for (int l = 0;l <= k;l++){
for (int j = W;j >= 0;j--){
ll choose = 0,dis = 0,free = 0;
dis = dp[!chk][j][l];
if (j >= w[i])
choose = dp[!chk][j - w[i]][l] + v[i];
if (l >= 1)
free = dp[!chk][j][l - 1] + v[i];
dp[chk][j][l] = check(choose,dis,free);
// printf("j:%d l:%d choose:%lld dis:%lld free:%lld \n",j,l,choose,dis,free);
// printt(i);
}
}
// printt(i);
chk = !chk;
}
maxv = dp[!chk][W][0];
for (int i = 1;i <= k;i++){
// cout << 1 << ':' << dp[!chk][W][i] << '\n';
if (dp[!chk][W][i] > maxv)maxv = dp[!chk][W][i];
}
cout << maxv << '\n';
return 0;
}