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