hdu 1171

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
using namespace std;
const int maxn = 250000;
long long dp[255555];
long long val[5005];
long long m[55];
long long v[55];
long long lim;
int main()
{
    long long n,i,j,l;
    long long a,b;
    while(~scanf("%lld",&n) && n > 0)
    {
        l = 0;
        lim = 0;
        memset(dp, 0, sizeof(dp));
        for(i=1; i<=n; ++i)
        {
            scanf("%lld%lld",&a,&b);
            while(b--)
            {
                val[l++] = a;
                lim += a;
            }
        }
        for(i=0;i<l;++i)
        {
            for(j=lim/2; j>= val[i]; --j)
            {
                dp[j] = max(dp[j],dp[j-val[i]]+val[i]);
            }
        }
        long long k = dp[lim/2];
        printf("%lld %lld
",lim-k,k);
    }
}

问题描述
如今,我们都知道计算机学院是HDU最大的部门。但是,也许你不知道计算机学院在2002年曾经被分为计算机学院和软件学院。
拆分绝对是HDU中的一件大事!同时,这也是一件麻烦事。所有设施都必须减半。首先,评估所有设施,如果两个设施具有相同的价值,则认为两个设施相同。假定有N(0 <N <1000)种设施(不同的价值,不同的种类)。
 

输入
输入包含多个测试用例。每个测试用例都以数字N开始(0 <N <= 50 - 不同设施的总数)。接下来的N行包含一个整数V(0 <V <= 50 - 设施值)和一个整数M(0 <M <= 100 - 对应的设施数量)。你可以假设所有的V都不相同。
以负整数开始的测试用例会终止输入,并且不会处理该测试用例。
 

产量
对于每种情况,打印一行包含两个整数A和B,分别表示计算机学院和软件学院的价值将分别得到。 A和B应该尽可能相等。同时,你应该保证A不小于B.
 

示例输入
2
10 1
20 1
3
10 1
20 2
30 1
-1
 

示例输出
20 10
40 40
 

就是01背包

原文地址:https://www.cnblogs.com/mltang/p/8798038.html