Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 50468 Accepted Submission(s): 17235 Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever been split into Computer College and Software College in 2002.
Input Input contains multiple test cases. Each test case starts with a number N (0 < N <= 50 -- the total number of different facilities). The next N lines contain an integer V (0<V<=50 --value of facility) and an integer M (0<M<=100 --corresponding number of the facilities) each. You can assume that all V are different.
Output For each case, print one line containing two integers A and B which denote the value of Computer College and Software College will get respectively. A and B should be as equal as possible. At the same time, you should guarantee that A is not less than B.
Sample Input 2 10 1 20 1 3 10 1 20 2 30 1 -1
Sample Output 20 10 40 40
Author lcy
Recommend We have carefully selected several similar problems for you: 2602 1203 2159 2955 2844
|
题目大意:2002年学院分为两个比如一个是A一个是B,现在要分东西了,给你n样物品,其中每一样都有它的价值和件数,现在要求把他们分开,如果能两边拥总和一样最好,不然就让A拥有的价值总和大于B拥有的价值总和。
思路:母函数求得前缀和,比较输出即可
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 250010
using namespace std;
int a[N],b[N],i,j,k,last,last2,v[50],n[50];
int main()
{
int t;
while(cin>>t&&t>=0)
{
int x,y;
for(int i=0; i<=t-1; i++)
{
cin>>x>>y;
v[i]=x;
n[i]=y;
}
last=0;
a[0]=1;
for(i=0; i<=t-1; i++)
{
last2=last+n[i]*v[i];
memset(b,0,sizeof(int)*(last2+1));
for(j=0; j<=n[i]; j++)
for(k=0; k<=last; k++)
b[k+j*v[i]]+=a[k];
memcpy(a,b,sizeof(int)*(last2+1));
last=last2;
}
for (i=last/2; i>=0&&a[i]==0; i--);
cout<<last-i<<' '<<i<<endl;
}
return 0;
}