描述:

  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 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. 

  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.

代码:

  多重背包转化为01背包问题,可以认为在一个容量为所有物品价值累加和的一半的背包中,尽量达到最大值。

  第一版:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include <math.h>
#define N 105
#define M 1000
using namespace std; int main(){
int n,v[N],dp[N][M],a,b,volume,sum;
while( scanf("%d",&n)!=EOF && n> ){
volume=;sum=;
for( int i=;i<n;i++ ){
scanf("%d%d",&a,&b);
volume+=(a*b);
while( b-- )//将单个物品依次加入
v[sum++]=a;
}
sum--;
//需要初始化dp中的全部值为0,下一次dp比较的值,上一次可能没有赋值,比较时将与负值(未初始化)进行比较,得到不正确的值
//for( int i=0;i<volume;i++ )
// dp[0][i]=0;
memset(dp,,sizeof(dp)); for( int i=;i<=sum;i++ ){
for( int j=v[i];j<=volume/;j++ ){
dp[i][j]=max(dp[i-][j],dp[i-][j-v[i]]+v[i]);//转移方程
}
}
printf("%d %d\n",max(dp[sum][volume/],volume-dp[sum][volume/]),min(dp[sum][volume/],volume-dp[sum][volume/]));
}
system("pause");
return ;
}

测试用例:

2

10 1

20 1

3

10 1

20 2

30 1

-1

  测试用例2答案是对的,用例1答案不对。因为对于用例1,20大于总价值一半(15),故dp值均为0,最后结果为0。为此,不妨使用优化版的dp,即使用一维数组dp,这样就算出现刚才的情况,较早的dp值即为答案。

  值得注意的是,背包要求尽量装满,故初始化时需要全部赋值为0(不赋值则出错)。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include <math.h>
#define N 105
#define M 100000
using namespace std; int main(){
int n,v[N],dp[M],a,b,volume,sum;
while( scanf("%d",&n)!=EOF && n> ){
volume=;sum=;
for( int i=;i<n;i++ ){
scanf("%d%d",&a,&b);
volume+=(a*b);
while( b-- )//将单个物品依次加入
v[sum++]=a;
}
sum--;
//需要初始化dp中的全部值为0,下一次dp比较的值,上一次可能没有赋值,比较时将与负值(未初始化)进行比较,得到不正确的值
memset(dp,,sizeof(dp)); for( int i=;i<=sum;i++ ){
for( int j=volume/;j>=v[i];j-- ){
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);//转移方程
}
}
printf("%d %d\n",max(dp[volume/],volume-dp[volume/]),min(dp[volume/],volume-dp[volume/]));
}
system("pause");
return ;
}

HDU1171-Big Event in HDU的更多相关文章

  1. HDU-1171 Big Event in HDU

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  2. HDU1171——Big Event in HDU(母函数)

    Big Event in HDU DescriptionNowadays, we all know that Computer College is the biggest department in ...

  3. hdu1171 Big Event in HDU 01-背包

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171 Problem ...

  4. hdu1171 Big Event in HDU(01背包) 2016-05-28 16:32 75人阅读 评论(0) 收藏

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

  5. hdu1171 Big Event in HDU(多重背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 多重背包题目不难,但是有些点不能漏或错. #include<iostream> #includ ...

  6. HDU-1171 Big Event in HDU(生成函数/背包dp)

    题意 给出物品种类,物品单价,每种物品的数量,尽可能把其分成价值相等的两部分. 思路 背包的思路显然是用一半总价值当作背包容量. 生成函数则是构造形如$1+x^{w[i]}+x^{2*w[i]}+.. ...

  7. Big Event in HDU(HDU1171)可用背包和母函数求解

    Big Event in HDU  HDU1171 就是求一个简单的背包: 题意:就是给出一系列数,求把他们尽可能分成均匀的两堆 如:2 10 1 20 1     结果是:20 10.才最均匀! 三 ...

  8. Big Event in HDU[HDU1171]

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

  9. poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)

    题目链接: id=3211">poj3211  hdu1171 这个题目比1711难处理的是字符串怎样处理,所以我们要想办法,自然而然就要想到用结构体存储.所以最后将全部的衣服分组,然 ...

  10. Big Event in HDU

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

随机推荐

  1. poj2521---lose money

    #include <stdio.h> #include <stdlib.h> int rever(int n) { return -n; } int main() { int ...

  2. Cocos2d—X游戏开发之CCTableView详解(十一)

    本来很早就想写关于CCTableView的文章,但是在基本功能实现之后呢,项目需求增加导致对这个控件的研究必须更加深入一点. 好的,现在开始介绍一下这个控件,在Cocos2d—X引擎中,这是一个仿制i ...

  3. WebStorm 7.0 注冊码

    经測试 WebStorm 6 7均能够使用例如以下注冊码,简直就是神key啊! WebStorm 6.0 7.0 注冊码 User Name: EMBRACE   License Key: ===== ...

  4. 从零开始学习UNITY3D(GUI篇 群组视图控件)

    控件组可以看成一个大的容器,控件组里面的控件,相对位置已该控件组为基准,而不再已屏幕左上角为基准. 下面来看一下代码实例及其效果截图: public class GUI2 : MonoBehaviou ...

  5. ASP.NET实现列表页连接查询 拼接sql语句 绑定grivdView

    ASP.NET实现列表页连接查询 拼接sql语句 如图效果: 基本需求:1.当页面第一次加载的时候默认查询一个月时间(或者说是登陆者所属权限的所有数据)的数据绑定到gridView 2.添加查询条件时 ...

  6. wget多进程抓取的实现

    把以前博客的东西夜迁移过来吧,这个是以前公司做的,原来放在csdn里面,先切过来. 用多进程实现的 wget多进程抓取的实现,有问题联系我 (微博:偶是周亮) #!/bin/bash url_path ...

  7. 在WHERE子句中引用取别名的列

    版权说明:作者:张颖希(PocketZ's Blog)出处:http://www.cnblogs.com/PocketZ本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页 ...

  8. RPC介绍以及编程

    1 RPC介绍 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协 议. RPC采用客 ...

  9. 【转载】谈谈Cookie

    0×00 引言 在Web技术的发展史上,Cookie技术的出现是一次重大的 变革.但是, Cookie技术又是一项非常有争议的技术,从它诞生之日起就成了广大网络用户和Web开发人员的一个争论焦点,原因 ...

  10. [C#技术参考]在PictureBox 中绘图防止闪烁的办法

    开篇之前说点别的,马上年终了,好希望年终奖大大的,但是好像这次项目的展示很重要,所以这几天绷得比较近,但是真的没有感觉烦,就是害怕来不及.所以抓紧了.下面直接正题.说一下用到的东西,都是Google搜 ...