可能是自己的英语不好,一开始不能理解题目的意思,所以还是先讲一下题目的意思,现在acboy有m天的时间来修n门课程,然后给你一个矩阵,A[i][j]表示话J天的时间学习i门课程能够得到A[i][j],那么我们的任务就是把acboy所拥有的天数m天分成一些部分来学习这其中的课程,使得能够在学校课程当中收获最多。
看过背包九讲的话,做这个就容易多了,其实就是简单的分组背包问题。
View Code
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 int dp[110],value[110][110]; 5 int main() 6 { 7 int n,m; 8 while(scanf("%d%d",&m,&n)!=EOF&&m&&n) 9 { 10 for(int i=0;i<m;i++) 11 for(int j=0;j<n;j++) 12 scanf("%d",&value[i][j]); 13 memset(dp,0,sizeof(dp)); 14 for(int i=0;i<m;i++) 15 for(int j=n;j>=1;j--) 16 for(int k=1;k<=j;k++) 17 { 18 dp[j]=dp[j]>dp[j-k]+value[i][k-1]?dp[j]:dp[j-k]+value[i][k-1]; 19 // cout<<"现在在"<<i+1<<"组"<<endl; 20 // cout<<"更新"<<j<<" "<<dp[j]<<endl; 21 // system("pause"); 22 } 23 printf("%d\n",dp[n]); 24 } 25 return 0; 26 } 27