您的位置:首页 > 其它

杭电 1171 Big Event in HDU(606比赛选拔 2017-08-20)(1003)

2017-08-26 14:00 330 查看
可转化成01背包问题.

虽然有重复的物品,但可以把每个物品看做是一个独立的个体。这样就相当于把混合背包问题转化成01背包。背包的容量就是{(总价值)/2}.

问题描述

如今,我们都知道,计算机学院是杭州电子科技大学最大的部门。但是,也许你不知道,计算机学院曾经被拆分为计算机学院和软件学院。

分裂绝对是在杭州电子科技大学的一个大事件!同时,它是一个麻烦的事情。所有的设施必须平分。首先,所有设施进行评估,和两个设施被认为是相同的如果他们有相同的价值。假定有n(0<n<1000)各类设施(不同的价值、不同种类)。

输入

输入包含多个测试案例。每个测试案例,从一个数n(0<n<=50——不同设施的总数)。接下来的n行包含一个整数v(0 < v = 50 -设备的值)和一个整数m(0 < < = 100—相应的设施数量)。你可以认为所有V是不同的。

一个测试用例,从一个负整数终止输入和测试案例是不能处理。

输出

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

Sample Input

2
10 1
20 1
3
10 1
20 2
30 1
-1

 

Sample Output

20 10
40 40

#include<cstdio>
#include<cstring>
#define mmax(a,b) a>b?a:b
int f[5000];
int dp[255555];
int main()
{
int n;
while(scanf("%d",&n)!=EOF,n>0){
memset(f,0,sizeof(f));
memset(dp,0,sizeof(dp));
int number,value;
int i,j,l=0;
int sum=0;
for(i=0;i<n;i++){
scanf("%d%d",&value,&number);
for(j=0;j<number;j++){
f[l++]=value;
sum+=value;
}

}
for(i=0;i<l;i++){
for(j=sum/2;j>=f[i];j--){
dp[j]=mmax(dp[j],dp[j-f[i]]+f[i]);
}
}
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  杭电 acm 背包