Big Event in HDU(背包九讲_多重背包转01背包)


Big Event in HDUCrawling in process...
Crawling failed
Time Limit:5000MS    
Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit
Status

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 

题意:有n种物品,然后每一行的两个数,第一个是价值,第二个是商品的数量,把这n种物品分为A,B两份,要求A,B之间的差值大于等于0,且A>=B
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int dp[100010];
int main()
{
	int p[1010],num[1010];
	int n,i,j,k;
	int sum=0,ave;
	while(~scanf("%d",&n))
	{
	    if(n<=-1)//这里注意
            break;
        sum=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d %d",&p[i],&num[i]);
			sum+=p[i]*num[i];
		}
        memset(dp,0,sizeof(dp));
		ave=sum/2;
		for(i=1;i<=n;i++)
			for(j=1;j<=num[i];j++)
				for(k=ave;k>=p[i];k--)
					dp[k]=max(dp[k],dp[k-p[i]]+p[i]);
		printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
	}
	return 0;
}



时间: 2024-10-25 22:01:32

Big Event in HDU(背包九讲_多重背包转01背包)的相关文章

悼念512汶川大地震遇难同胞――珍惜现在,感恩生活(背包九讲_多重背包)

悼念512汶川大地震遇难同胞――珍惜现在,感恩生活Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价

背包九讲之多重背包

背包九讲原文: 题目 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本算法 这题目和完全背包问题很类似.基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件.令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程: f[i][v]=max{f[i-1][v-k*c[i]]

ACboy needs your help(背包九讲_分组背包)

ACboy needs your helpCrawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description ACboy has N courses this term, and he plans to spend at most M days on study.Of course,

【动态规划】背包九讲及相应习题

[参考博客及视频] 1.大雪菜 2.背包九讲——全篇详细理解与代码实现 3.dd大牛的<背包九讲> 4.背包问题 (附单调队列优化多重背包 [题目] 1.Acwing 背包题目 2.01背包问题 Luogu 2925 干草出售Luogu 1616 疯狂的采药HDU 3466 Proud Merchants 3.完全背包问题 HDU 1114 Piggy-BankLuogu 1853 投资的最大效益 4.多重背包问题 HDU 1059 DividingLuogu P1776 宝物筛选 5.混合背

完全背包(背包九讲)

题目: 有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 思路: 这个问题非常类似于01背包问题,所 不同的是每种物品有无限件.也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件.取1件.取2件--等很多种.如果仍然按照解 01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值.仍然可以按照每种物品不同的策略写出状态转

01背包问题的学习(来源:背包九讲)

问题: 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 思路: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放.用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}.这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的.所以有必要将它详细解释一下:"

有依赖的背包问题(背包九讲)

问题: 这种背包问题的物品间存在某种"依赖"的关系.也就是说,i依赖于j,表示若选物品i,则必须选物品j.为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖:另外,没有某件物品同时依赖多件物品. 算法: 这个问题由NOIP2006金明的预算方案一题扩展而来.遵从该题的提法,将不依赖于别的物品的物品称为"主件",依赖于某主件的物品称为"附件".由这个问题的简化条件可知所有的物品由若干主件和依赖于每个主件的一个附件集合组成.按照背

二维费用背包问题(背包九讲)

------------------------------------------ 前言: 对于一些背包问题,重点还是在于如何找出"背包容量"和"各种代价",以及价值,如此问题便迎刃而解了.下午 打篮球居然下冰雹了,悲催了.... ------------------------------------------ 问题: 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有 一个可付出的最大值(背包容量)

转载:《背包九讲》

<背包九讲> P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}. 这个方程非常重要,基