hdu 1171 母函数

题意:n种物品,第i种价值num[i],数量cnt[i],要将其尽量平分成两份,问这两份的价值各是多少?

分析:多重背包的题,用母函数做的。

输入数据以负数结束,但我看到样例最后一行是-1,就以为是以-1结束,TLE了半天。。。

 

 

const int N = 50, M = 250000;
int a[2][M+1], p, q, n, sum;
int num[N+1], cnt[N+1];//值和个数



int main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    #endif

    while(scanf("%d", &n), n>=0){
        sum = 0;
        FOE(i, 1, n) {
            scanf("%d%d", &num[i], &cnt[i]);
            sum += num[i] * cnt[i];
        }
        int s = sum>>1, temp=0, t;

        memset(a, 0, sizeof a);
        q = 0;
        a[0][0] = 1;
        FOE(i, 1, n){
            p = 1-q;
            temp += num[i] * cnt[i];
            t = min(temp, s);
            FOE(j, 0, t) if(a[q][j]) {
                FOE(k, 0, cnt[i]){
                    int v = j+k*num[i];
                    if(v>t) break;
                    a[p][v] += a[q][j];
                }
            }
            memset(a[q], 0, sizeof a[q]);
            q = p;
        }

        FOD(i, s, 0) if(a[q][i]) {
            printf("%d %d\n", sum-i, i);
            break;
        }
    }

    return 0;
}

 

posted @ 2013-05-23 10:55  心向往之  阅读(154)  评论(0)    收藏  举报