博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Big Event in HDU
阅读量:4359 次
发布时间:2019-06-07

本文共 2291 字,大约阅读时间需要 7 分钟。

Big Event in HDU

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 29411 Accepted Submission(s): 10332

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.
The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0N<1000) kinds of facilities (different value, different kinds).

Input

Input contains multiple test cases. Each test case starts with a number N (0N <= 50 – the total number of different facilities). The next N lines contain an integer V (0V<=50 –value of facility) and an integer M (0M<=100 –corresponding number of the facilities) each. You can assume that all V are different.
A test case starting with a negative integer terminates input and this test case is not to be processed.

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
将n种物品尽可能的平分,每种物品有自己的价值和数量,多重背包,二进制优化

#include 
#include
#include
#include
#include
#include
#define LL long longusing namespace std;const int MAX = 110000;int dp[200000];int w[100];int num[110];int main(){ int n,sum,ans; while(scanf("%d",&n)&&n>=0) { sum=0; for(int i=1;i<=n;i++) { scanf("%d %d",&w[i],&num[i]); sum+=(w[i]*num[i]); } ans=sum/2; int ant,bit,s; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { ant=1; bit=1; s=0; while(s
=ant*w[i];j--) { dp[j]=max(dp[j-ant*w[i]]+ant*w[i],dp[j]); } s+=ant; if(s+bit*2<=num[i]) { ant=bit*2; } else { ant=num[i]-s; } bit*=2; } } printf("%d %d\n",max(dp[ans],sum-dp[ans]),min(dp[ans],sum-dp[ans])); } return 0;}

转载于:https://www.cnblogs.com/juechen/p/5255987.html

你可能感兴趣的文章
【安富莱二代示波器教程】第18章 附件C---波形拟合
查看>>
将博客搬至CSDN
查看>>
英文字母的换行问题
查看>>
[有明信息]重视测算,精校成本源头 ——浅谈房地产开发目标成本测算
查看>>
【巧用百度地图】—百度地图生成器(直接获取代码)
查看>>
linux 正则表达式 元字符
查看>>
BZOJ2154 Crash的数字表格 【莫比乌斯反演】
查看>>
Kafka/Zookeeper集群的实现(二)
查看>>
每天记命令:lscpu 和 cat /proc/cpuinfo
查看>>
160个crackme 004 ajj.1
查看>>
Linux Bash代码 利用for循环实现命令的多次执行
查看>>
Ansible优化
查看>>
洛谷P1395 会议 题解
查看>>
Hibernate学习笔记(一)
查看>>
bzoj1975: [Sdoi2010]魔法猪学院
查看>>
单元测试
查看>>
java8-1 final
查看>>
三次握手和四次挥手
查看>>
Flask框架入门(一)
查看>>
nginx错误优化总结
查看>>