hdoj1171
//用母函数来做
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int N, M, V, B, Max;
bool s1[250000]; //由于只要求知道存在与否,不要求数值,可以用bool型
int main()
{
while (scanf("%d", &N) != EOF && N > -1) {
memset(s1, 0, sizeof(s1)); //初始化
s1[0] = 1;
Max = 0;
for (int i = 0; i < N; ++i) {
scanf("%d%d", &V, &M);
for (int j = 0; j <= M; ++j) {
for (int k = 0; k <= Max / 2; ++k) {
s1[k + j * V] |= s1[k]; //与或,相当于'加'
}
}
Max += V * M; //不断地增加最大数值
}
B = Max / 2;
while (!s1[B]) //只要能形成B,就一定能形成A(A=Max-B)
B--;
printf("%d %d\n", Max - B, B);
}
}
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int N, M, V, B, Max;
bool s1[250000]; //由于只要求知道存在与否,不要求数值,可以用bool型
int main()
{
while (scanf("%d", &N) != EOF && N > -1) {
memset(s1, 0, sizeof(s1)); //初始化
s1[0] = 1;
Max = 0;
for (int i = 0; i < N; ++i) {
scanf("%d%d", &V, &M);
for (int j = 0; j <= M; ++j) {
for (int k = 0; k <= Max / 2; ++k) {
s1[k + j * V] |= s1[k]; //与或,相当于'加'
}
}
Max += V * M; //不断地增加最大数值
}
B = Max / 2;
while (!s1[B]) //只要能形成B,就一定能形成A(A=Max-B)
B--;
printf("%d %d\n", Max - B, B);
}
}