题目描述
小雪的学校成立了学生法庭,他被推举为大法官。法庭的裁决取决于陪审团的决定,陪审团的人员来自学校的同学。每次开庭前,法庭会聘请n人作为侯选陪审员,其编号分别为1,2,…,n;然后由大法官从n位侯选陪审员中选出m人作为正式陪审员。具体的选择过程如下:由原告和被告分别给每一位候选陪审员打分,分值范围为[0, 20],0分表示完全不喜欢,20分表示此人非常适合作陪审员。大法官将根据原告和被告双方对每一位侯选陪审员打出的分数来选择m人作为正式的陪审员。为了保证公平审判,原告被告双方对最终陪审团的喜好程度应该尽量平衡。具体而言,给定n个侯选陪审员以后,选出m个人组成陪审团的原则是:原告方和被告方对这m个人的所打的分数之和应该尽量接近(两个数“尽量接近”表示他们的差的绝对值尽量小);若存在多个方案,则应该选择其中一个方案,使原告和被告方对这m个人所打的分数的总和最大。
例如:n = 4, m = 2
原告方打分: ① 5 ② 11 ③ 7 ④ 9
被告方打分: ① 9 ② 11 ③ 8 ④ 14
此时最佳方案是选择第②和第③号候选人,这是因为这个方案中原告对②③打分之和为11+7=18,被告对②③打分之和为11+8=19,两者之差的绝对值为1,这是所有方案中最小的。
再比如:n = 4, m = 2
原告方打分: ① 10 ② 1 ③ 1 ④ 2
被告方打分: ① 1 ② 2 ③ 10 ④ 1
如果选择①③,则
原告对①③的打分和 = 10 + 1 = 11
被告对①③的打分和 = 1 + 10 = 11
原告和被告对①③的打分和的差的绝对值 = |11-11| = 0
原告和被告对①③的打分和的总和 = 11 + 11 = 22
如果选择②④,则
原告对②④的打分和 = 1 + 2 = 3
被告对②④的打分和 = 2 + 1 = 3
原告和被告对②④的打分和的差的绝对值 = |3-3| = 0
原告和被告对②④的打分和的总和 = 3 + 3 = 6
虽然这两种方案中原告和被告打分和同样地接近,但是选择①③可使原告和被告打分和的总和达到最大,所以最佳方案应该选择①③。
作为大法官,小雪已经非常的忙了,几乎没有空闲的时间。所以想请你帮他计算最佳方案中原告和被告分别对陪审员打分和的差的绝对值和总和。相信你一定能轻松的完成任务的。
输入格式
输入文件的第一行是两个被空格隔开的整数n和m,其中n为候选人的数目,1<=n<=200;m为需要选择的陪审员的数目,1<=m<=20且m<=n。接下来有n行,每行包含两个用空格隔开的整数,分别表示原告和被告对某个候选人所打的分,分值在0到20之间(包含0和20)。
输出格式
输出文件只有一行,包含两个用空格隔开的整数,第一个数表示原告和被告对所选择的m个人打分和的差的绝对值,第二个数表示原告和被告对所选择的m个人的打分总和。
样例输入
4 2
5 9
11 11
7 8
9 11
样例输出
1 37
const lim=4000; var f:array[0..1,0..21,-lim..lim] of longint; g:array[0..1,0..21,-lim..lim] of boolean; a,b:array[0..201] of longint; n,m,i,j,k,now,pre,tk,ans,sum:longint; function max(a,b:longint):longint; begin if a>b then exit(a); exit(b); end; begin readln(n,m); for i:=1 to n do readln(a[i],b[i]); pre:=0; now:=1; g[pre,0,0]:=true; for i:=1 to n do begin fillchar(f[now],sizeof(f[now]),0); fillchar(g[now],sizeof(g[now]),0); for j:=0 to m do for k:=-lim to lim do if g[pre,j,k] then begin g[now,j,k]:=true; f[now,j,k]:=max(f[now,j,k],f[pre,j,k]); tk:=k+a[i]-b[i]; if abs(tk)>lim then continue; if g[now,j+1,tk] then f[now,j+1,tk]:=max(f[now,j+1,tk],f[pre,j,k]+a[i]+b[i]) else begin g[now,j+1,tk]:=true; f[now,j+1,tk]:=f[pre,j,k]+a[i]+b[i]; end; end; pre:=1-pre; now:=1-now; end; ans:=maxlongint; for i:=0 to lim do if g[pre,m,i] then begin ans:=i; sum:=f[pre,m,i]; end; for i:=0 downto -lim do if g[pre,m,i] then if abs(i)<ans then begin ans:=abs(i); sum:=f[pre,m,i]; end; writeln(ans,' ',sum); end.