hdu(1171)

Big Event in HDU

Time Limit:

10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 19752    Accepted Submission(s): 6900
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
分析:多重背包问题,先计算总价值sum,然后取其一半V=sum/2;剩下的就是多重背包问题了
程序:
#include"stdio.h"
#include"string.h"
int f[250005];
int p[100],h[100];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,i,j,k,sum,V;
while(scanf("%d",&n),n>=0)
{
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&p[i],&h[i]);
sum+=p[i]*h[i];
}
V=sum/2;
for(i=0;i<=V;i++)
f[i]=0;
for(i=1;i<=n;i++)
{
for(j=V;j>=p[i];j--)
{
for(k=0;k<=h[i]&&k*p[i]<=j;k++)
f[j]=f[j]>f[j-k*p[i]]+k*p[i]?f[j]:f[j-k*p[i]]+k*p[i]; }
}
printf("%d %d\n",sum-f[V],f[V]);
}
return 0;
}
运行时间2309ms
还有一种可快速的方法就是利用二进制混合背包:
程序:
#include"string.h"
#include"stdio.h"
int f[250020],V;
void zopack(int v,int p)
{
int i;
for(i=V;i>=v;i--)
f[i]=f[i]>f[i-v]+p?f[i]:f[i-v]+p;
}
void allpack(int v,int p)
{
int i;
for(i=v;i<=V;i++)
f[i]=f[i]>f[i-v]+p?f[i]:f[i-v]+p; }
void multiplepack(int v,int p,int h)
{
if(v*h>=V)
{
allpack(v,p);
return;
}
int k=1;
while(k<h)
{
zopack(k*v,k*p);
h-=k;
k<<=1;
}
if(h>0)
{
zopack(h*v,h*p);
}
}
int main()
{
int n,i,v[111],h[111];
while(scanf("%d",&n),n>=0)
{
int sum=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&v[i],&h[i]);
sum+=v[i]*h[i];
}
V=sum/2;
for(i=0;i<=V;i++)
f[i]=-999;
f[0]=0;
for(i=0;i<n;i++)
{
multiplepack(v[i],v[i],h[i]);
}
int ans=-1;
for(i=V;i>=0;i--)
{
if(f[i]>=0)
{
ans=f[i];
break;
}
}
printf("%d %d\n",sum-ans,ans);
}
return 0;
}

时间只用31~64ms

hdu(1171)多重背包的更多相关文章

  1. Big Event in HDU(HDU 1171 多重背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. hdu 1171 多重背包

    题意:给出价值和数量,求能分开的最近的两个总价值,例如10,20*2,30,分开就是40,40 链接:点我 #include<cstdio> #include<iostream> ...

  3. hdu 5445 多重背包

    Food Problem Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  4. HDU 1171 Big Event in HDU (多重背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. 题解报告:hdu 1171 Big Event in HDU(多重背包)

    Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. Bu ...

  6. hdu 1171 Big Event in HDU(多重背包+二进制优化)

    题目链接:hdu1171 思路:将多重背包转为成完全背包和01背包问题,转化为01背包是用二进制思想,即件数amount用分解成若干个件数的集合,这里面数字可以组合成任意小于等于amount的件数 比 ...

  7. hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  8. Big Event in HDU(多重背包套用模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Othe ...

  9. HDU1171--Big Event in HDU(多重背包)

    Big Event in HDU   Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  10. hdu 1059 (多重背包) Dividing

    这里;http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意是有价值分别为1,2,3,4,5,6的商品各若干个,给出每种商品的数量,问是否能够分成价值相等的 ...

随机推荐

  1. Scripting Languages

    Computer Science An Overview _J. Glenn Brookshear _11th Edition A subset of the imperative programmi ...

  2. Image Formats

    http://www.html5rocks.com/en/tutorials/speed/img-compression/ https://developers.google.com/speed/we ...

  3. Fortran并行计算的一些例子

    以下例子来自https://computing.llnl.gov/tutorials/openMP/exercise.html网站 一.打印线程(Hello world) C************* ...

  4. 关于Java中文乱码与日期格式

    关于Java中文乱码与日期格式 Java中文乱码的问题其实很普遍了,首先,一般不会在Windows平台下面出现,同时,一般在Tomcat应用服务器下也都正常,但是到了WebSphere,Weblogi ...

  5. linux shell send and receive emails

    http://www.netcan666.com/2016/02/20/%E5%88%A9%E7%94%A8telnet%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5% ...

  6. Solr4.3之检索建议suggest

    原文链接:http://www.656463.com/article/Efm26v.htm 很多才学solr的人,都容易把solr spellcheck和solr suggest混淆,误以为他们是一样 ...

  7. Solaris 10下Qt编译Oracle 10g驱动

    上回书讲到<Oracle 10g在Solaris 10中安装详解>,现在开始用Qt来编译下Oracle 10g驱动吧!这样就可以通过Qt程序联入Oracle数据库了! Oracle的环境变 ...

  8. jdk 8 lambda表达式 及在Android Studio的使用示例

    以前觉得java让人觉得有趣的一个特点是支持:匿名内部类,而最近发现jdk8已支持lambda并有更简便的方式,来实现匿名内部类. 这会让程序员更舒服,更喜欢java. 多年前觉得java语法和C#语 ...

  9. 【C++】动态内存与智能指针

    C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...

  10. Red and Black---hdu1312(dfs)

    2015-04-07http://acm.hdu.edu.cn/showproblem.php?pid=1312 Sample Input 6 9....#......#............... ...