#include <iostream>
参考来自背包九讲之分组背包(注意三个循环的顺序,多重背包转换为01背包求解时,也有一定的顺序,否则则错)
#include <cstdio>
#include <string.h>
#define INF -999999
using namespace std;
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int m,n,j,i,t,s[150][150],dp[10010];
while(scanf("%d%d",&n,&m),m,n)
{
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
scanf("%d",&s[i][j]);
for (i=0;i<=m;++i)
dp[i]=0;
for (i=1;i<=n;++i)//分组考虑
for (t=m;t>=1;--t)//倒叙保证了顶多选了一件
for (j=1;j<=m;++j)
if (t>=j)
dp[t]=max(dp[t-j]+s[i][j],dp[t]);
printf ("%d\n",dp[m]);
}
return 0;
}