2、题目大意:
Problem Description
目前我们知道Computer College是HDU最大的部门,但是,可能你不知道在2002年,Computer College已经分成Computer College 和 Software College两部分,与此同时,出现了一个问题,所有的设施必须两等分,首先,所有的设施已经被估价,如果两种设施价格相同,则被认为是一样的,假设有N种设施(不同的价格,不同的种类)
Input
输入包括多组样例,每组样例第一行输入一个N(0 < N <= 50 ,不通风设施的总数)。接下来N行包括两个整数V(0<V<=50 )和M(0<M<=100 ),分别代表设施的价格和这种设施的个数,你可以假设所有的价格都是不同的,以输入复数结束;
Output
每组样例,打印一行包括两个数A、B,分别代表两个大学可以得到的最大价值,A和B应该尽量相等,同时,保证A不小于B
3、思路:简单的多重背包问题,注意二进制优化,错在输入复数结束,而不是-1
4、代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int v[5005];
int dp[250005];
int main()
{
int n,a,b;
while(scanf("%d",&n)!=EOF)
{
memset(v,0,sizeof(v));
memset(dp,0,sizeof(dp));
if(n<0)
break;
int k=1,sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
sum+=a*b;
for(int j=1;j<=b;j=j*2)
{
v[k++]=a*j;
b-=j;
}
if(b>0)
{
while(b--)
{
v[k++]=a;
}
}
}
for(int i=1;i<=k;i++)
{
for(int j=sum/2;j>=0;j--)
{
if(j>=v[i])
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
return 0;
}
/*
2
10 1
20 1
3
10 1
20 2
30 1
-1
*/