博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Big Event in HDU(杭电1171)(多重背包)和(母函数)两种解法
阅读量:6501 次
发布时间:2019-06-24

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

Big Event in HDU

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


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 (0<N<1000) kinds of facilities (different value, different kinds).
 

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.
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
//背包方法:
#include
#include
#include
using namespace std;int dp[100000],sum,ans;struct st{ int v; int m;}data[100000];void full(int x){ for(int i=data[x].v;i<=ans;i++) dp[i]=max(dp[i],dp[i-data[x].v]+data[x].v);}void one(int x){ for(int j=1;j<=data[x].m;j++) for(int i=ans;i>=data[x].v;i--) dp[i]=max(dp[i],dp[i-data[x].v]+data[x].v);}int main(){ int i,j,n; while(scanf("%d",&n)&&(n>0)) { memset(dp,0,sizeof(dp)); sum=0; for(i=1;i<=n;i++) { scanf("%d%d",&data[i].v,&data[i].m); sum+=data[i].v*data[i].m; } ans=sum/2; for(i=1;i<=n;i++) { if(data[i].v*data[i].m>=ans) full(i); else one(i); } printf("%d %d\n",sum-dp[ans],dp[ans]); } return 0;}
//母函数方法:
/*注意将数组a,s清零,WA了好几次,測试数据都过。。无语。 */#include
#include
int a[250010],s[250010];int v[55],m[55]; int main(){ int n,i,j,k,sum,ans; while(scanf("%d",&n)&&n>0) { sum=0; memset(s,0,sizeof(s)); memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { scanf("%d%d",&v[i],&m[i]); sum+=v[i]*m[i]; } for(i=0;i<=v[1]*m[1];i+=v[1])//注意变化。 { s[i]=1; } for(i=2;i<=n;i++) { for(j=0;j<=sum;j++) { for(k=0;k+j<=sum&&k<=v[i]*m[i];k+=v[i]) { a[k+j]+=s[j]; } } for(k=0;k<=sum;k++) { s[k]=a[k]; a[k]=0; } } for(i=sum/2;i>=0;i--) { if(s[i]) { printf("%d %d\n",sum-i,i); break; } } } return 0;}
 

转载地址:http://kbvyo.baihongyu.com/

你可能感兴趣的文章
COMP 0137 Machine Vision
查看>>
urlrewrite使用小结
查看>>
游戏AI之初步介绍(0)
查看>>
Python3基础笔记---面向对象
查看>>
单目和双目模式识别---游戏控制
查看>>
嵌入式开发之信号采集同步---VSYNC和HSYNC的作用以及它们两者之间的关系
查看>>
ti的硬件时钟和系统时钟同步
查看>>
设置应用图标badge(徽章)
查看>>
ORACLE SQL: 经典查询练手第二篇
查看>>
运动目标检测ViBe算法
查看>>
MySQL基本概念
查看>>
推荐两款简单好用的图片放大jquery插件
查看>>
Java实现MD5(32/16位大小写)加密
查看>>
[emuch.net]MatrixComputations(1-6)
查看>>
zencart安全辅助小脚本
查看>>
alter system switch logfile与alter system archive log current的区别
查看>>
第十周项目5:贪心的富翁
查看>>
利用SurfaceView显示正弦曲线,仿造示波器
查看>>
scala学习手记34 - trait方法的延迟绑定
查看>>
centos 7 部署k8s集群
查看>>