hdu 3496
典型的二位费用背包问题,主要是边界的考虑
#include <iostream>
#include <cstdio>
#include <cstring>
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int inf=0x3f3f3f3f;
int f[100+10][1000+10];
int w[100+10],v[100+10];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m,l;
cin>>n>>m>>l;
int i,j,k;
for(i=1;i<=n;i++) cin>>w[i]>>v[i];
mem(f,-inf);
mem(f[0],0);
for(i=1;i<=n;i++)
{
for(j=m;j>=0;j--)
{
for(k=l;k>=0;k--)
{
if(j>0&&k>=w[i]) f[j][k]=max(f[j][k],f[j-1][k-w[i]]+v[i]);
}
}
}
if(f[m][l]<0) f[m][l]=0;
cout<<f[m][l]<<endl;
}
return 0;
}

浙公网安备 33010602011771号