题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712
思路:这是一道简单的分组背包,因为每种课可以有多种选择:花几天时间在该课上。一旦作出选择,就不能再选该课,就相当于有多组物品,每组内的物品互相冲突,最多只能选一件。
伪码:
for 所有的组k for v=V..0 for 所有的i属于组k f[v]=max{f[v],f[v-c[i]]+w[i]}
View Code
1 #include<iostream> 2 const int MAXN=110; 3 using namespace std; 4 int dp[MAXN]; 5 int map[MAXN][MAXN]; 6 7 int main(){ 8 int n,m; 9 while(~scanf("%d%d",&n,&m)){ 10 if(n==0&&m==0)break; 11 for(int i=1;i<=n;i++){ 12 for(int j=1;j<=m;j++){ 13 scanf("%d",&map[i][j]); 14 } 15 } 16 memset(dp,0,sizeof(dp)); 17 for(int i=1;i<=n;i++){ 18 for(int j=m;j>=1;j--){ 19 for(int k=1;k<=m;k++){ 20 if(j-k>=0){ 21 dp[j]=max(dp[j],dp[j-k]+map[i][k]); 22 } 23 } 24 } 25 } 26 printf("%d\n",dp[m]); 27 } 28 return 0; 29 30 }