#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背包