NYOJ 325

简介:   zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2   描述今天是阴历七月初五,acm队员zb的生日。zb正在和C小加、never在武汉集训。他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜。

 

zb的生日

时间限制: 3000 ms | 内存限制: 65535 KB
难度: 2
 
描述
今天是阴历七月初五,acm队员zb的生日。zb正在和C小加、never在武汉集训。他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜。当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小。每个西瓜的重量已知,你能帮帮他么?
 
输入
多组测试数据(<=1500)。数据以EOF结尾
第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
输出
输出分成两堆后的质量差
样例输入
5
5 8 13 27 14
样例输出
3
#include<stdio.h>
#include<math.h>
int T, total, ans, sum;
int ch[21];
void dfs(int cur, int sum)
{
	if(T== cur)
	    return;
	int t;
	t=(int)fabs(total-sum-sum);
	if(t < ans)
	     ans = t;
	dfs(cur+1, sum);
	dfs(cur+1, sum+ch[cur]);
}
int main()
{

	int i;
	while(scanf("%d", &T)!=EOF)
	{
		total = 0;
	   for(i=0;i<T;i++)
	   	{
		   scanf("%d", &ch[i]);
		   total += ch[i];
	   } 
		ans	 = 0x7FFFFFFF;
	   dfs(0, 0);
	   if(T==0)
	        printf("0\n");
	   else
	        printf("%d\n", ans);
    }
    return 0;
}






//TLE
#include<stdio.h>
 #include<math.h>
 #include<string.h>
 int min, sum, total, n;
 int weight[25];
 int vis[25];
 void get_next(int cur, int n, int a[])
 {
     if(cur == n)
     {
         if(min > (int)fabs(total - 2 * sum))
             min = (int)fabs(total - 2 * sum);
         return;
     }
     get_next(cur + 1, n, a);
     for(int i = 0; i < n; i++)
     {
         if(!vis[i])
         {
             vis[i] = 1;
             sum += a[i];
             get_next(cur + 1, n, a);
             sum -= a[i];
             vis[i] = 0;
         }
     }
 }
 int main()
 {
     int i;
     while(scanf("%d", &n) != EOF)
     {
         total = 0;
         memset(vis, 0, sizeof(vis));
         for(i = 0; i < n; i++)
         {
             scanf("%d", &weight[i]);
             total += weight[i];
         }
         sum = 0;
         min = 200001;
         get_next(0, n, weight);
         printf("%d\n", min);
     }
     return 0;
 }


//01背包TLE
#include<stdio.h>
#include<string.h>
int main()
{
	int T,i,j;int sum;
	int ch[21],d[100001];
	while(scanf("%d",&T)!=EOF)
	{
		sum=0;
		memset(d,0,sizeof(d));//ch没必要
		for(i=1;i<=T;i++)
		{
			scanf("%d",ch+i);
			sum+=ch[i];
		}
		//temp=(sum+1)/2;
		for(i=1;i<=T;i++)
			for(j=(sum+1)/2;j>=ch[i];j--)
				if(d[j]<d[j-ch[i]]+ch[i])
						d[j]=d[j-ch[i]]+ch[i];
		printf("%d\n",sum-2*d[temp]);
	}
	return 0;
}
//停止
#include<stdio.h>
#include<string.h>
int T;
int visit[21],ch[21];
void dfs(int ans,int sum)
{
	int i,j,k,temp;
	temp=(sum+1)/2;
	if(ans<temp&&ans+ch[i-1]>temp&&i==T)
		printf("%d\n",sum-2*ans);
	else
		for(i=1;i<=T;i++)
			if(!visit[i-1])
			{
				ans+=ch[i-1];
				visit[i]=1;
				if(ans>temp)
					{
						dfs(ans-ch[i-1],sum);
						visit[i-1]=0;
					}
			}
}
int main()
{
	int i,j;int sum;
	int d[100001];
	while(~scanf("%d",&T))
	{
		sum=0;
		memset(d,0,sizeof(d));//ch没必要
		memset(visit,0,sizeof(visit));
		for(i=1;i<=T;i++)
		{
			scanf("%d",ch+i);
			sum+=ch[i];
		}
		dfs(0,sum);
	}
	return 0;
}

 

目录
相关文章
|
人工智能 算法
|
测试技术
NYOJ 541
  最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业。但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争。
773 0
|
JavaScript
NYOJ&#160;17
时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 题目很经典,学习一下吧。
672 0
|
网络协议
NYOJ 8
  一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);1.
794 0
|
人工智能
NYOJ 461
  Fibonacci数列(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述 数学神童小明终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
724 0
NYOJ 93
  汉诺塔(三) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。
601 0
|
人工智能
NYOJ 55
  懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 小明很想吃果子,正好果园果子熟了。在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
955 0
NYOJ 113
1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int pos=-1; 8 string s; 9 while(getline(cin,s)) 10 { 11 while((pos=s.
682 0