hdu1171 Big Event in HDU

来源:互联网 发布:华师在线网络教育怎么 编辑:程序博客网 时间:2024/05/16 11:27

hdu1171 Big Event in HDU

标签:01背包


题目链接

/*    题意:有N种物品,每种价值为V,数量为M。平分为A,B两堆,A,B之差尽可能小,且A不小于B。    思路:01背包变形,用总价值的一半total/2去选择最多价值的物品。*/#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int maxn = 125555 + 5;int dp[maxn], value[5005];int main(){    int N;    while(scanf("%d", &N) && N > 0)    {        int total = 0, pos = 0;        int a, b;        for(int i = 0; i < N; i++)        {            scanf("%d %d", &a, &b);            total += a * b;            for(int j = 0; j < b; j++)  value[pos++] = a;  ///        }        memset(dp, 0, sizeof(dp));  //ZeroOnePack template        for(int i = 0; i < pos; i++)            for(int j = total / 2; j >= value[i]; j--)                dp[j] = max(dp[j], dp[j - value[i]] + value[i]);        printf("%d %d\n", max(dp[total / 2], total - dp[total / 2]), min(dp[total / 2], total - dp[total / 2]));    }    return 0;}