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 }

 

posted on 2016-03-27 16:28  pb2016  阅读(188)  评论(0编辑  收藏  举报