#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;
}