http://acm.hdu.edu.cn/showproblem.php?pid=1712
哎,分组背包的问题,而且没变形,算是基础的了,但我WA了一天
哎,悲剧
关键是我写的转移方程有漏洞
我的原来是
dp[i][j]=max(dp[i-1][j],dp[i-1][j-k]+profit[i][k]);
应该还要考虑以下方程本身
dp[i][j]=max(dp[i][j],dp[i-1][j],dp[i-1][j-k]+profit[i][k]);
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stack>
#include <iostream>
#include <vector>
using namespace std;
int max(int a,int b,int c)
{
int d=a>b?a:b;
return d>c?d:c;
}
int dp[105][105];
int profit[105][105];
int main()
{
int n,m,a,b,i,j,k;
int T;
while(scanf("%d%d",&n,&m),n|m)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&profit[i][j]);
}
}
memset(dp,0,sizeof(dp));
int zmax=(-1)*(0x7fffffff);
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
for(k=1; k<=j; k++)
{
dp[i][j]=max(dp[i][j],dp[i-1][j],dp[i-1][j-k]+profit[i][k]);
if(dp[i][j]>zmax)
zmax=dp[i][j];
}
}
}
printf("%d\n",zmax);
}
}
果然还是优化下的好:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
int dp[105];
int profit[105][105];
int main()
{
int n,m,a,b,i,j,k;
int T;
while(scanf("%d%d",&n,&m),n|m)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&profit[i][j]);
}
}
memset(dp,0,sizeof(dp));
int zmax=(-1)*(0x7fffffff);
for(i=1; i<=n; i++)
{
for(j=m; j>=0; j--)
{
for(k=1; k<=j; k++)
{
dp[j]=max(dp[j],dp[j-k]+profit[i][k]);
}
}
}
printf("%d\n",dp[m]);
}
}