简单的二维背包问题,我还是想了好久,,,,,dp[i][j] i与一维的一样,j是有几个在边上的了
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std ;
long long int a[1001][2];
long long int dp[4001][3];
int main()
{
int cases;
scanf("%d",&cases);
for(int y = 1;y<=cases;y++)
{
int m,n;
scanf("%d%d",&m,&n);
long long int maxn=0;
memset(dp,0,sizeof(dp));
n*=2;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a[i][0],&a[i][1]); a[i][0]*=2; //和n一起乘2以防小数
maxn = max(maxn,a[i][1]); //肯定可以放一个
}
for(int i=0;i<m;i++)
{
for(int j=n;j>=a[i][0]/2;j--)
{
for(int k=2;k>=0;k--)
{
if(j>=a[i][0])
{
dp[j][k] = max(dp[j][k],dp[j-a[i][0]][k]+a[i][1]); //正常背包
}
if(k>=1)
{
dp[j][k] = max(dp[j][k],dp[j-a[i][0]/2][k-1]+a[i][1]); //加上在边上的限制
}
}
}
}
for(int i=0;i<=n;i++)
{
for(int j=0;j<=2;j++) maxn=max(maxn,dp[i][j]);
}
printf("Case #%d: ",y);
printf("%lld\n",maxn);
}
return 0;
}