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;
}


原文地址:https://www.cnblogs.com/lj030/p/3002212.html