做到 hdu4003(树形dp+分组背包)发现分组背包我好想还没做过…遂补这道水题,然并暖hdu4003我还是在思考中ing.
题意:Acboy 有n门课,m空闲天来选课。给你一个矩阵A[i][j]表示第i门课选修了j天则可以获利的权值,问总共获利最大是?
思路:分组dp.
设dp[i][j]表示:已选i门课j天后最大获利。
dp[i][j]=max(dp[i-1][j-k]+M[i][k]);
#include<bits/stdc++.h>
using namespace std;
int dp[110][110],M[110][110];
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)&&n&&m){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&M[i][j]);
}
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=0;k<=j;k++){
dp[i][j]=max(dp[i][j],dp[i-1][j-k]+M[i][k]);
}
}
}
printf("%d\n",dp[n][m]);
}
}