/** 题目:hdu1712 ACboy needs your help 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 题意:有n门课程,最多m天学习。 给定A[i][j]表示第i门课程学习了j天会获得的学习能量; 求学完m天后可以获得的最多学习能量。 思路:分组背包 每一门课程为一组。组内物品m个。每个物品费用为j,价值为A[i][j]; 每一组要么一个物品不选,要么只能选某一个物品。 */ #include <cstdio> #include <cstring> #include <algorithm> #include <set> #include <iostream> #include <cmath> #include <vector> #include <map> using namespace std; typedef long long LL; #define ms(x,y) memset(x,y,sizeof x) typedef pair<int, int> P; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; const int maxn = 500; int dp[104], w[104][104]; int main() { int n, m; while(scanf("%d%d",&n,&m)==2) { if(n+m==0) break; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ scanf("%d",&w[i][j]); } } ms(dp,0); for(int i = 1; i <= n; i++){ for(int j = m; j >= 1; j--){ for(int k = 1; k <= m; k++){ if(j>=k) dp[j] = max(dp[j],dp[j-k]+w[i][k]); } } } cout<<dp[m]<<endl; } return 0; }