作业帮 > 综合 > 作业

PASCAL 编一个PASCAL程序,给定一堆正整数,要求分成两堆,两堆数的和分别为S1和S2,使S1²-S2

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/22 11:53:21
PASCAL
编一个PASCAL程序,
给定一堆正整数,要求分成两堆,两堆数的和分别为S1和S2,使S1²-S2²最小
【输入】
第一行n,表示共有n个数
第二行共n个用空格隔开的正整数a[i],表示给定的一堆正整数
【样例输入】
4
1 2 3 4
【样例输出】
0
样例说明1和4一堆,2和3一堆,5*5-5*5 = 0题目分析题目给出n个数,让你将这n个数分成两组,使得两组和的平方差的绝对值最小,输出此时这两组的和的平方差的绝对值.算法分析这道题经过仔细分析不难发现,其实是一道0/1背包的变形版.0/1背包我在这里不再重点提及.首先我们用0/1背包的思想,求出这n个数能够到达的所有值,记这n个数的总和为s,然后我们将所有可能到达的值,用循环i进行逐一计算,当这个值存在时,即此时的值为abs(sqr(s-i)-sqr(i)),就这样求出全部这些值中的最小值即可.参考程序var
  i,j,k,m,n,s,t,min:longint;
  f:array[0..100000] of boolean;
  a:array[1..1000] of longint;
begin
  read(n);
  s:=0;
  for i:=1 to n do
  begin
    read(a[i]);
    s:=s+a[i];
  end;
  f[0]:=true;
  for i:=1 to n do
  begin
    for j:=s downto a[i] do
      if f[j-a[i]] then f[j]:=true;
  end;
  min:=maxlongint;
  for i:=1 to s do
    if f[i] then
    begin
      if abs(sqr(i)-sqr(s-i))<minthen min:=abs(sqr(i)-sqr(s-i));
    end;
  writeln(min);
end.
再问: 话说abs是什么
再答: 就是求绝对值。
若x大于等于0,abs(x)=x,否则abs(x)=-x。
换句或说,就是符号取正号,数值不变。