拔河比赛
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.