拔河比赛

拔河比赛

Time Limit:10000MS  Memory Limit:65536K
Total Submit:146 Accepted:61
Case Time Limit:1000MS

Description

  一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近。
  

Input

  输入数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450)。

Output

  输出数据应该包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出。

Sample Input

3
100
90
200

Sample Output

190 200

Source

pku 2756


如果加起来等于K那么就是答案

program Tug;

const  maxn=100;

       maxn2=maxndiv 2;

       maxrange=450;

var  c:array [0..maxn2,0..maxn2*maxrange] ofboolean;

     w:array[1..maxn] of longint;

     n,n2,sum,i,j,k,min,ans:longint;

begin

 

  read(n); n2:=(n+1) div 2;//n2:=中间人数。

  sum:=0;

  for i:=1 to n do

    begin

      read(w[i]);

      inc(sum,w[i]);      //总人数

    end;

 

  fillchar(c,sizeof(c),0);

  c[0,0]:=true;

  for i:=1 to n do

      for j:=n2-1 downto 0 do

        for k:=maxrange*i downto 0do

          if c[j,k] then c[j+1,k+w[i]]:=true; //如果有可能加起来等于k。

 

  min:=maxlongint;

  ans:=0;

  for k:=0 to maxrange*n2 do

      if c[n2,k] and (abs(sum-k-k)<min) then//如果有可能加起来等于k。

      begin

        min:=abs(sum-k-k);

        if k<=sum div 2 then ans:=k elseans:=sum-k;

      end;

  write(ans,' ',sum-ans);

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值