HDU 1171 Big Event in HDU

题解:将背包总量分为两份,之后多重背包即可

#include <cstdio>

#include <cstring>

int f[300000],w[1000],t[1000];

int main()

{

    int n;

    while(scanf("%d",&n),n>=0)

    {

        int v=0;

        for(int i=1; i<=n; i++){

            scanf("%d%d",&w[i],&t[i]);

            v+=w[i]*t[i];

        }

        memset(f,0,sizeof f);

        for(int j=1; j<=n; j++)

        for(int k=1; k<=t[j]; k++)

        for(int i=v/2; i>=k*w[j]; i--)

        if (f[i-w[j]]+w[j]>f[i]) f[i]=f[i-w[j]]+w[j];

        printf("%d %d\n",v-f[v/2],f[v/2]);    

    }

    return 0;

}

 

你可能感兴趣的:(event)