1 /********************************************************** 2 题目: ACboy needs your help 3 链接: http://acm.hdu.edu.cn/showproblem.php?pid=1712 4 题意: 一开始输入n和m,n代表有n门课,m代表你有m天,然 5 后给你一个数组,val[i][j],代表第i门课,在通过j 6 天去修,会得到的分数。求在m天能得到的最大分数。 7 算法: 分组背包 8 9 ***********************************************************/ 10 11 #include<iostream> 12 #include<cstring> 13 using namespace std; 14 15 const int mx=105; 16 int dp[mx][mx],a[mx][mx]; 17 18 int main() 19 { 20 int n,m,i,j,k; 21 while (cin>>n>>m) 22 { 23 if (n==0&&m==0) return 0; 24 25 ///输入及初始化 26 for (i=1;i<=n;i++) 27 { 28 for (j=1;j<=m;j++) cin>>a[i][j]; 29 } 30 memset(dp,0,sizeof(dp)); 31 32 ///分组背包模板。 33 for (i=1;i<=n;i++) 34 { 35 for (j=1;j<=m;j++) 36 { 37 for (k=0;k<=j;k++) ///k一定要从0开始。 38 dp[i][j]=max(dp[i][j],dp[i-1][j-k]+a[i][k]); 39 } 40 } 41 cout<<dp[n][m]<<endl; 42 } 43 }