/*
TASK:tre
LANG:C++
*/
#include<iostream>
using namespace std;

int map1[1002][101]={0};
double map2[1002][101]={(double)0};
class dist
{
public:
double chance;
int profit;
int time;
};

int sort_f(const void *a, const void *b)
{
   return(((dist*)a)->chance>((dist*)b)->chance?-1:1);
}


dist map3[1002];
int main()
	{
	int n, k, l, d;
	cin>>n>>k>>l>>d;
	for(int j=1;j<=l;j++)
	for(int i=1;i<=d;i++)
		cin>>map1[j][i];
	for(int i=1;i<=l;i++)
		for(int j=1;j<=d;j++)
			map1[j][i]=map1[j-1][i]+map1[j][i];
	for(int i=1;i<=l;i++)
		for(int j=1;j<=d;j++)
			map2[j][i]=(double)map1[j][i]/j;
	for(int i=1;i<=l;i++)
		{
		map3[i].time=d;
		map3[i].profit=map1[d][i];
		for(int j=d-1;j>0;j--)
			if(map2[j+1][i]>map2[j][i]) map2[j][i]=map2[j+1][i]; else {map3[i].time=j; map3[i].profit=map1[j][i];};
		};  
	for(int i=1;i<=l;i++)
		map3[i].chance=map2[1][i];  
	qsort((void *)(map3+1),l, sizeof(dist), sort_f);
int s=0;
int i=1;
int t=0;
	do
	{
	if(t+map3[i].time<=k)
	{
	s+=map3[i].profit;
	t+=map3[i].time;
	}
	else
	break;
	i++;
	}while(t<=k);
	cout<<s<<"\n";
	return 0;
	}
