自己拿01背包瞎整的,居然就过了。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
ll max(ll a,ll b,ll c)
{
ll d=max(b,c);
d=max(a,d);
return d;
}
ll W[200000],V[200000];
int cnt=0;
ll dp[10050][150];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0) break;
memset(dp,0,sizeof(dp));
cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%lld",&V[cnt]);
W[cnt++]=j+1;
}
}
// printf("cnt=%d\n",cnt);
// for(int i=0;i<cnt;i++)
// {
// printf("V=%lld W=%lld\n",V[i],W[i]);
// }
for(int i=0;i<n*m;i+=m)
{
for(int j=0;j<=m;j++)
{
for(int k=0;k<m;k++)
{
if(j<W[i+k]) dp[i+m][j]=max(dp[i+m][j],dp[i][j]);
else dp[i+m][j]=max(dp[i+m][j],dp[i][j],dp[i][j-W[i+k]]+V[i+k]);
//if(j==2) printf("%lld %lld %lld\n",dp[i+m][j],dp[i][j],dp[i][j-W[i+k]]+V[i+k]);
}
}
}
// for(int i=0;i<=m;i++)
// {
// printf("%d ",dp[n*m][i]);
// }
printf("%d\n",dp[n*m][m]);
}
return 0;
}