首页 > 代码库 > vijos1412 多人背包

vijos1412 多人背包

01背包+归并

看的题解  https://vijos.org/p/1412/solution

#include<cstdio>
#include<cstring>
using namespace std;
int a[205];
int b[205];
int f[5005][55];
int k,n,v;
void work(int *aa,int *bb,int c)
{
    int t[105];
    int ti=1;
    int ai=1;
    int bi=1;
    while(ai+bi<=k+1)
    {
        if(aa[ai]>bb[bi]+c) t[ti++]=aa[ai++];
        else t[ti++]=bb[bi++]+c;
    }
    for(int i=1;i<=k;i++) aa[i]=t[i];
}
int main()
{
    scanf("%d%d%d",&k,&v,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
    }
    for(int i=0;i<=v;i++)
    {
        for(int j=0;j<=k;j++)
            f[i][j]=-1e7;
    }
    f[0][1]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=v;j>=a[i];j--)
        {
            work(f[j],f[j-a[i]],b[i]);    
        }
    }
    int ans=0;
    for(int i=1;i<=k;i++) ans+=f[v][i];
    printf("%d\n",ans);
    return 0;
}

 

vijos1412 多人背包