#include <stdio.h>
#include <string.h>
#include <stdlib.h>
long u;
long max2(long a, long b)
{
return (a>b)?a:b;
}
long max3(long a, long b, long c)
{
return max2(a, max2(b,c));
}
/*
long m(long i, long j, long h[], long w[])
{
if(i==0 || j==0)
return 0;
else
{
// if(h[i]>j)
if(h[i]+(u*(i-1))>j)
return m(i-1, j, h, w);
else
return max3( m(i-1, j, h, w), m(i-1, j-h[i], h, w) + w[i], m(i, j-1, h, w));
}
}
*/
int main()
{
// nr gutui, inaltimea maxima, inaltarea, rezultatul final
long n, hi, smax=0;
// inantimea fiecarei gutui si greutatea
long h[100001], w[100001], i, j, aux;
long hmin;
FILE *f=fopen("gutui.in", "r");
FILE *g=fopen("gutui.out", "w");
fscanf(f, "%ld %ld %ld", &n, &hi, &u);
long **m=(long **) malloc((n+1)*sizeof(long*));
for(i=0; i<=n; i++)
m[i]=(long *) malloc((hi+1)*sizeof(long));
for(i=1; i<=n; i++)
fscanf(f, "%ld %ld", &h[i], &w[i]);
//trebuie inlocuit cu quicksort, de exemplu
for(i=1; i<=n-1; i++)
for(j=i+1; j<=n; j++)
if(h[i]<h[j])
{
aux=h[i];
h[i]=h[j];
h[j]=aux;
aux=w[i];
w[i]=w[j];
w[j]=aux;
}
printf("Dupa quicksort: \n");
for(i=1; i<=n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
hmin=h[n-1];
printf("hmin este: %ld\n", hmin);
//pana aici sigur e bine
//cazurile de baza
for(i=0; i<=hi; i++)
m[0][i]=0;
for(i=0; i<=n; i++)
m[i][0]=0;
//recurenta
for(i=1; i<=n; i++)
for(j=1; j<=hi; j++)
{
//if(h[i]>j)
if(h[i]+(u*(i-1))>j)
m[i][j]=m[i-1][j];
//if(h[i]<=j)
if(h[i]+(u*(i-1))<=j)
//m[i][j]=max3(m[i-1][j], m[i-1][j-h[i]]+w[i], m[i][j-1]);
m[i][j]=max3(m[i-1][j], m[i-1][j-1]+w[i], m[i][j-1]);
}
smax=m[n][hi];
//smax=m(n, hi, h, w);
printf("%ld\n", smax);
fprintf(g, "%ld", smax);
for(i=0; i<=n; i++)
free(m[i]);
free(m);
fclose(f);
fclose(g);
return 0;
}