`
jackchen0227
  • 浏览: 146788 次
  • 性别: Icon_minigender_1
  • 来自: 帝都
社区版块
存档分类
最新评论

**joj 1903 tug of war 使用动态规划

    博客分类:
  • ACM
阅读更多

 1903: Tug of War


Result TIME Limit MEMORY Limit Run Times AC Times JUDGE
15s 8192K 556 123 Standard
A tug of war is to be arranged at the local office picnic. For the tug of war, the picnickers must be divided into two teams. Each person must be on one team or the other; the number of people on the two teams must not differ by more than 1; the total weight of the people on each team should be as nearly equal as possible.

The first line of input contains n the number of people at the picnic. n lines follow. The first line gives the weight of person 1; the second the weight of person 2; and so on. Each weight is an integer between 1 and 450. There are at most 100 people at the picnic.

The input may contain several test cases.

Your output will be a single line containing 2 numbers: the total weight of the people on one team, and the total weight of the people on the other team. If these numbers differ, give the lesser first.

Sample Input

3
100
90
200

Output for Sample Input

190 200
/*
	使用动态规划计算tug of war 
	其实动态规划类似于搜索
	搜索所有可能的状态,分辨哪些是可达的
*/
#include<iostream>  
using namespace std;  
int n,w[103],sum,ans,l,r;  
bool dp[45005][103];  //row:表示重量 col:表示人数
int main()  
{  
	int i;
   // freopen("in.txt","r",stdin);  
	//freopen("car.out","w",stdout); 
	while(scanf("%d", &n) != EOF)
	{
		memset(dp, 0, sizeof(dp));  
		 
		sum=0;  
		for(i=1;i<=n;i++)
			scanf("%d",&w[i]),sum+=w[i];  
		dp[0][0]=1; //表明体重是0 人数是0这个状态是可达的
		dp[0][101]=1;//人数最多是100,所以此时也是可达的
		/*
			下面两重循环首先计算出dp[w[i]][101] = 1,然后在向上累加
		*/
		for(i=1;i<=n;++i)  //人数开始循环
			for(int j=sum;j>=w[i];--j)  //体重开始循环,倒着推,可以避免重复计算???
				if(dp[j-w[i]][101])  
				{  
					dp[j][101]=1;  //如果dp[j-w[i]][101]可达,那么增加体重后dp[j][101]=1一定可达
					/*
						如果dp[0][0]可达,那么dp[w[i]][1]可达,
						所以如果dp[j-w[i]][k]可达,那么增加体重(同时也要增加人数)的dp[j][k+1]=1;  一定可达
					*/
					for(int k=0;k<n;k++)  
						if(dp[j-w[i]][k])
							dp[j][k+1]=1;  
				}  
		ans=sum/2; //最理想的状况是sum的一半 
		while(!(dp[ans][101] && (dp[ans][n/2] || dp[ans][(n+1)/2]))) //如果此时状态不可达,那么ans减小
			--ans;  
		printf("%d %d\n",ans,sum-ans);  				
	}
	return 0;  
}  

这种方法有局限性,只能适用于给数数据的上限,比如最多100人,每个人的体重最大450.如果没有这种限制,则不能使用dp。可以使用随机方法

分享到:
评论

相关推荐

    joj上做的一些ACM试题

    ACM标签明确了这些题目与ACM竞赛相关,通常涉及的问题包括但不限于算法设计、数据结构、图论、数学建模、动态规划、搜索算法、排序算法、字符串处理等。ACM题目的特点是要求高效,因为比赛中需要在有限的时间内解决...

    Joj - Java Version of Java-开源

    Java 开源项目 Joj 是一个致力于为 Java ...Joj 的源代码、API 文档以及示例代码通常可在其官方网站或 GitHub 上找到,以便于开发者进一步学习和使用。通过参与开源社区,开发者还可以为项目贡献代码,共同推动其发展。

    JOJ-jilin-university--acm.rar_joj

    每一份程序代码都代表了一个独立的解题思路,涵盖了基础到进阶的算法,如排序、搜索、动态规划、图论等。 2. **ACM**:ACM是"Annual Collegiate Computing Competition"的缩写,这里可能指的是与ACM竞赛相关的题目...

    joj acm 部分习题解答

    1. **算法基础**:如排序算法(快速排序、归并排序等)、搜索算法(深度优先搜索、广度优先搜索)、动态规划等。 2. **数据结构**:如链表、树(二叉树、平衡树)、图、栈、队列、哈希表等的运用。 3. **数学应用**...

    joj 部分题目答案 自己做的 仅供参考

    joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考 joj 部分题目答案 自己做的 仅供参考

    joj 1424 硬币兑换问题

    标题“joj 1424 硬币兑换问题”描述的是一个经典的计算机编程问题,它涉及到使用动态规划(Dynamic Programming, DP)方法来解决硬币找零问题。在这个问题中,我们要找到使用最少数量的硬币来凑成特定金额的方式。...

    joj.rar_joj

    这是因为假设最旧的页面不再被频繁使用,因此淘汰它可能导致最小的缺页率。然而,FIFO算法在实际应用中往往表现不佳,因为它容易引发Belady异常,这是一种理论上可能的情况,即增加分配给进程的物理页面数反而导致...

    acm.rar_acm jlu 10_acm jlu 1029_joj 1237_joj10

    描述中提到的"joj acm 源代码",JOJ(Judge Online Judge)是一个在线编程评测系统,很多高校和编程爱好者使用它来提交和测试代码,解决各种算法问题。源代码通常是程序员编写的原始程序,这里指的可能是参赛者在ACM...

    吉林大学ACM题集.pdf-JOJ

    #### 标题:吉林大学ACM题集.pdf—JOJ 此文档标题明确指出了文档的主要内容——一个由吉林大学组织编写的ACM竞赛题集,并且该题集是以PDF格式提供的。这里提到的“JOJ”即吉林大学在线裁判系统(Jilin University On...

    JoJ-crx插件

    Etre au courant quand JoJ est en live,策划人semaine et liens vers lesréséauxauxsocioaux Soyez au courant纠结JoJ开始à流光! 现场直播将继续进行。 约翰·奎因·伊斯特·布鲁和克林·德集团的非官方网站 D...

    吉林大学 joj 1000-2645题代码

    吉林大学 joj 1000-2645题代码,嘿嘿,大家就不用在花JPOINT买代码了,祝ACMer实现自己的心愿

    安全文明施工管理目标【精选文档】.doc

    4. **现场管理目标**:根据JOJ59—59安全检查标准和重庆市建筑工地文明施工标准,对施工现场进行规范化管理,争取成为重庆市的安全文明施工示范工地。 5. **安全管理目标**: - **安全教育目标**:建立安全生产...

    acm joj 1600

    根据给定的信息,本文将详细解释“acm joj 1600”中的两种大数取模运算方法。此问题主要关注如何高效地计算形如 \(a^b \mod m\) 的表达式,这对于处理大数据或进行密码学运算非常重要。 ### 大数取模运算 #### ...

    一个有关调度的问题joj1015

    这个题其实现在想起来也不知道是怎么就给ac的。

    JoJo-s-Bizarre-Survival:一个模组,将JoJo的奇异冒险中的看台添加到Minecraft

    该mod基于荒木飞吕彦的JoJo的奇妙冒险漫画和动漫系列。 这个mod也受到KnightDemon的1.12 mod 极大启发。 这个mod的目的是要从专营权中尽可能多地增加Minecraft,该mod目前仅包含Stand能力,其他能力(Hamon,...

    furystudios

    furystudios 普尔维·扎达塔克(Prvi zadatak) ...DroppingOff - radnikhodajućidolazi做pripadajuće科萨雷(izvedeno kroz provjeru tagova kutije)我卡达joj JE dovoljno blizu,fizičkiJE lan

    ControlEstoque_GH:..

    Este Projeto签证是由estoque进行的,它是由mer mercadorias uma determinada empresa sejam averiguadas和atualizadas ... 2021年1月20日,由JoséCláudiodeAraújoJúnior和Annielly Ferreira de Sousa所设计。

    大智慧最新安装

    大智慧最新安装包,老的已经过期不能查询个人自选股,所以推荐最新的大智慧给大家安装

Global site tag (gtag.js) - Google Analytics