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

 

posted @ 2014-01-22 15:17  forever97  阅读(129)  评论(0编辑  收藏  举报