简单DP,就是个背包
/*
dp[i][j]=max( dp[i-1][j+k]+a[i][k] );
DP很重要的一点就是临界条件,DP的起点和终点的选取一定要慎重,有一点点问题都会Wrong Answer
对于起点和终点最好自己动手模拟一下
*/
#include<stdio.h>
#include<string>
#define N 105
int n,m;
int a[N][N],dp[N][N];
int max(int a,int b) {
return a>b?a:b;
}
void solve() {
int i,j,k;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++) {
for(j=m;j>=0;j--) {
for(k=0;k<=m;k++) {
if (j-k<0) continue;
dp[i][j-k]=max(dp[i][j-k],dp[i-1][j]+a[i][k]); //第i门课花了k天
}
}
}
int ans=0;
for(j=0;j<=m;j++) {
ans=max(dp[n][j],ans);
}
printf("%d\n",ans);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int i,j;
while(scanf("%d%d",&n,&m)&& n!=0 && m!=0) {
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++) {
scanf("%d",&a[i][j]);
}
}
solve();
}
}