- 一题(一遍过的题),分组背包裸题,详见通天之分组背包(pre blog)。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 105;
int n,W;
int v[maxn][maxn];
int dp [maxn];
int rec[maxn];
int main(){
while(cin>>n>>W){
if(n + W == 0) break;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=W;j++)
cin>>v[i][j];
for(int k=1;k<=n;k++){
for(int i=0;i<maxn;i++)
rec[i] = dp[i];
for(int i=1;i<=W;i++)
for(int j=W;j>=i;j--)
dp[j] = max(dp[j] , rec[j - i] + v[k][i]);
}
cout<<dp[W]<<endl;
}
return 0;
}