回 帖 发 新 帖 刷新版面

主题:(ACM求助)CounterStrike大赛

Description 

宿舍楼决定举行CounterStrike游戏大赛,为了使比赛更为精彩,大家决定将所有参赛同学先平均分为东西部两大联盟再组队对战,根据之前比赛的统计,每个同学的游戏战斗力分别为S1,S2,S3...SN.(S<=100000)。现在需要你将参赛同学平均分到两大联盟中,使得两联盟的总战斗力的差为最小,以增加比赛的激烈性。要注意的是两联盟的人数不一定相同,比如一个战斗力90000的同学能够以一敌十。 

Input 
该程序有多组测试数据,每组测试数据第一行为整数N(1<=N<=20),表示有N个同学。接下去N行,为每个同学的战斗力。
Output 
每组测试数据只需输出经过划分后两联盟的总战斗力差的最小值。
Sample Input 
5
5
8
13
27
14

2
4
4
Sample Output 
3
0

哪位达人说说思路,最好能用C++写一下,谢了

回复列表 (共3个回复)

沙发

用C编的
# include<stdio.h>
# include<math.h>
int b[20],n;
long a[20], max=100001;
void main()
{
  void out(int,int,int);
  int i;
  printf("How many players?\n");
  scanf("%d",&n);
  printf("They are\n");
  for (i=1;i<=n;i++)
  scanf("%ld",&a[i]);
  for (i=1;i<=n/2;i++)
  out(n,i,1);
  printf("%d\n",max);
}
void out(int j,int k,int l)
{
  void write(int);
  int i;
  if (k==0)
  write(l-1);
  else for (i=j;i>=k;i--)
       { b[l]=i; out(i-1,k-1,l+1); }
}
void write(int c)
{
  int i,s;
  long s1,s2;
  s1=0; s2=0;
  for (i=1;i<=c;i++)
  s1+=a[b[i]];
  for (i=1;i<=n;i++)
  s2+=a[i];
  s2-=s1;
  s=abs(s1-s2);
  if (s<max)
  max=s;
}
算法看起来不到好,还没调试过,应该行,如果你发现问题,就说出来

板凳

调试了一下,试的数据都正确,对了,把write函数了的变量s改成long型,可能更完善点

3 楼

没什么问题,我再找些数据测试一下

我来回复

您尚未登录,请登录后再回复。点此登录或注册