回 帖 发 新 帖 刷新版面

主题:谁能帮我?——石子归并问题

[em18]
问题叙述:
    你有一堆石头质量分别为W1,W2,W3...WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。
输入:
    该程序有多组测试数据,每组测试数据第一行为整数N(1<=N<=20),表示有N堆石子。接下去N行,为每堆石子的质量。
输出:
每组测试数据只需输出合并后两堆的质量差的最小值。
例:
输入
5
5
8
13
27
14
2
4
4
输出
3
0

欢迎高手解答,不胜荣幸,谢谢!

回复列表 (共8个回复)

沙发

program tju1017;
var a            : array[0..20]of longint;
    n, a1, a2, i : integer;
procedure sort;
var flag : boolean;
    j    : integer;
begin
  flag:=true;
  for i:=1 to n-1 do
  begin
    for j:=1 to n-i do
      if a[j]<a[j+1] then
      begin
        a[0]:=a[j+1]; a[j+1]:=a[j]; a[j]:=a[0];
        flag:=false;
      end;
    if flag then exit;
  end;
end;
begin
  repeat
    readln(n);
    for i:=1 to n do readln(a[i]);
    if n=1 then writeln(a[1]);
    if n=2 then writeln(abs(a[1]-a[2]));
    if (n<>1)and(n<>2) then
    begin
      sort; a1:=a[1]; a2:=a[2];
      for i:=3 to n do
        if a1>a2 then a2:=a[i]+a2 else a1:=a[i]+a1;
      writeln(abs(a1-a2));
    end;
  until seekeof;
end.

板凳

不知道是否正确,没有在tju上试过。

3 楼

我过了的程序(搜索);
program yb(input,output);
const max=20;
var z:array[1..max]of longint;
     n,i:longint;
     best:longint;
procedure search(step,bb:longint);
  begin
   if step=n+1 then begin if abs(bb)<best then best:=abs(bb);exit;end;
   search(step+1,bb+z[step]);
   search(step+1,bb-z[step]);
  end;
begin
  while not seekeof(input) do
   begin
    read(n);
     for i:=1 to n do
      read(z[i]);
    best:=maxlongint;
    search(1,0);
    writeln(best);
   end;
end.

4 楼

用动态规划好多了

5 楼

请问tju是什么?

6 楼


[img]http://bbs.cqreview.com/UploadFile/2005-7/2005712154831382.gif[/img]

7 楼

tju------http://acm.tongji.edu.cn/problem.php

8 楼

不要拿我东西再着刷!

我来回复

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