ZJNU——1695(分栗子)

分栗子

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 90   Accepted: 18

Description

亚洲赛要结束了,韩老师为了慰劳各位队员买了n袋栗子吩咐qs分给大家。馋嘴的qs想要把尽可能多的栗子给自己,但是又不能让大家发现,于是他决定在不超过一半重量的情况下拿走尽可能重的栗子

Input

输入第一行为T表示样例数

每组样例第一行为n(n<=15),接下来有n个数字表示每袋栗子的重量

Output

输出qs能拿走的栗子的总重量

一开始想的很简单,嗨,那不就是求和sum,然后再除以2就好了。可是不对,即使是取一半,但是有些例子中还是取不到的,因为是整数,有些时候只能取到小于一半数量的栗子。

这里提供两种方法,第一种是01背包法,因为它对于每种物品,只有取或不取两种情况,可以把sum/2类比成01背包中的那个最大容量,然后求的是在不超过那个最大容量的情况下,背包中能够装的最大容量的价值数。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

//一开始数组开太小了,注意这里的f数组指的是价值,看下面的循环,f[v],所以数组要开的稍微大一点;
int w[20],f[400];
int main(){
	int T,i,j,n,v;
	int sum;
	cin>>T;
	while(T--){
		memset(w,0,sizeof(w)); memset(f,0,sizeof(f));
		cin>>n;
		sum=0;
		for(i=0;i<n;i++){
			cin>>w[i];
			sum+=w[i];
		}
		sum=sum/2;
		for(i=0;i<n;i++){
			for(v=sum;v>=w[i];v--){
				if(f[v]>f[v-w[i]]+w[i])
					f[v]=f[v];
				else
					f[v]=f[v-w[i]]+w[i];
			}
		}
		cout<<f[sum]<<endl;
	}
}

第二种方法:

相当于是搜索,用递归并且遍历一遍所有的数组;

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

int a[16],mid,k;

void findx(int n,int sum){
	int tsum,i,j;
	for(i=n;i>=1;i--){
		tsum=sum+a[i];
		if(tsum>mid) continue;
		if(tsum==mid) {k=tsum; return ;}
		if(tsum<mid){
			findx(i-1,tsum);
			if(tsum==mid) { k=tsum;  return ;}
		}
		if(k<tsum) k=tsum;
	}
	return ;
}
int main(){
	int T,i,j;
	int sum,n;
	cin>>T;
	while(T--){
		memset(a,0,sizeof(a));
		mid=sum=0;  k=0;
		cin>>n;
		for(i=1;i<=n;i++){
			cin>>a[i];
			sum+=a[i];
		}
		sort(a+1,a+1+n);
		mid=sum/2;
		findx(n,0);
		cout<<k<<endl;
	}
}
时间: 2024-10-25 09:49:15

ZJNU——1695(分栗子)的相关文章

一个简单的文件管理程序

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)

各位看官们,大家好.上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧. 看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了,这一回我们将对前面章回中的内容进行总结和提示. 内存布局总结 C程序的内存布局主要有四个分区:代码区,数据区(data和bss).堆区和栈区.能够使用readelf -S filename查看各个分区的内存地址.这四个分区在内存中从低地址空间開始依次向高地址延伸.我们再次使用前面章回中的图直观地展

骗分大法之-----分块||迷之线段树例题a

什么是分块呢? 就是一种可以帮你骗到不少分的神奇的算法. 分块的写法有几种,我所知道的有①预处理②不预处理 不预处理的代码我看得一脸懵逼 所以我在这里就谈一下预处理的版本www 首先看一道题: 给定一个包含n个数的序列,初值全为0,现对这个序列有两种操作:操作1:把 给定 第k1 个数改为k2;操作2:查询 从第k1个数到第k2个数得最大值.(k1<=k2<=n) 所有的数都 <=100000 好的,如果我们搞遍历肯定超时到爆炸. 那么就要用到分块大法了 把这n个数分成若干块,然后每个块

ZJNU 1247 归并排序求逆序对

逆序对——高级 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 118   Accepted: 28 Description 对于一个包含N个非负整数的数组A[1..n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对.  例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个. 求n个数中的逆序对个数. Input 第一

HDU 1695 GCD(欧拉函数+容斥原理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, y)有多少组,不考虑顺序. 思路:a = c = 1简化了问题,原问题可以转化为在[1, b/k]和[1, d/k]这两个区间各取一个数,组成的数对是互质的数量,不考虑顺序.我们让d > b,我们枚举区间[1, d/k]的数i作为二元组的第二位,因为不考虑顺序我们考虑第一位的值时,只用考虑小于i的情

1695 windows 2013

1695 windows 2013 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 话说adamyi编的Windows 2013超时了(- -!),所以他不得不在自己家门口亲眼见证这个电影般的场景.虽然他不想错过这个美妙的时刻,但是他的肚子一再抗议,要求先吃完这最后的晚餐. 现在adamyi准备依次吃n道菜.但是他只使用勺子和筷子吃,勺子和筷子可以交替使用,但是同一种菜只能用一种餐具,在开饭前他拿的是筷子.用

一起talk C栗子吧(第一百六十三回:C语言实例--三目运算符)

各位看官们,大家好,上一回中咱们说的是套接字知识体系图的例子,这一回咱们说的例子是:三目运算符.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前一章回中对套接字进行了归纳和总结,从而结束了对套接字的介绍.这一回中我们将开始介绍一个新的知识,那就是三目运算符. 说明到三目运算符,有些看官可能不知道是什么,如果我写个符号,大家一定都知道是什么"?:".啊!原来是它呀.已经有看官发出了感叹.其实,有时候我也会和大家一样,只知道使用,却不知道它叫什么,哈哈. 我们今天来介绍

一起talk C栗子吧(第十一回:C语言实例--文件组织结构)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是最小公倍数的例子,这一回咱们不说具体的例子,咱们说一下C例子中的文件 组织方法以及实际开发软件时的"文件组织结构方法". 看官们,在我前面写的例子中,只有一个源文件(也就是通常看到的.c文件).我没有单独写头文件(也 就是通常看到的.h文件),而是把头文件的内容放到了源文件中.主要是这些例子中关于头文件的内容不 多,如果单

一起talk C栗子吧(第十九回:C语言实例--位操作)

各位看官们,大家好,上一回中咱们说的是输出十六进制的例子,这一回咱们说的例子是:位操作.闲话 休提,言归正转.让我们一起talk C栗子吧! 看官们,位操作有五种,与.或.非.异或.移位.接下来咱们分别介绍这些操作.为了方便说明,我们 先统一做一下说明,位操作的对象是比特位.假如有三个比特位:A.B和C,大家都知道比特位的值只有0 或者1两种,所以A.B和C的值是0或者1.我们把A和B当作位操作的对象,C当作A和B操作的结果. 与操作:操作符为&.例子:C=A & B.只有A和B的值都为1