http://acm.hdu.edu.cn/showproblem.php?pid=1712
(1)本题为分组背包问题,是基本类型。dp的核心是:
for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k=m;k>=j;k--) dp[i][k]=max(dp[i][k], dp[i-1][k-j]+a[i][j]), dp[i][k]=max(dp[i][k], dp[i-1][k]); //被我忽略的一行
我在写这题时,少掉了最后一行,一直WA,本质上是要对dp[i][k]赋予初值dp[i-1][k]:
for(i=1;i<=n;i++) { for(j=0;j<=m;j++) dp[i][j]=dp[i-1][j]; for(j=1;j<=m;j++) for(k=m;k>=j;k--) dp[i][k]=max(dp[i][k], dp[i-1][k-j]+a[i][j]); }
具体代码:
View Code
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n, m; int a[120][120]; int dp[120][120]; int main() { int i, j, k; while(scanf("%d%d", &n, &m)!=EOF, n||m) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d", &a[i][j]); memset(dp, 0, sizeof(dp)); for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k=m;k>=j;k--) dp[i][k]=max(dp[i][k], dp[i-1][k-j]+a[i][j]), dp[i][k]=max(dp[i][k], dp[i-1][k]); printf("%d\n", dp[n][m]); } return 0; }
