KSPREE - Triple Shoot
Tác giả: ladpro98
Ngôn ngữ: Pascal
program kspree;
uses math;
const maxn=30;
fi='';
var a,adj,stack:array[-1..maxn] of longint;
check:array[1..maxn] of boolean;
res,n,sum,i,d:longint;
procedure input;
var inp:text;
i:longint;
begin
assign(inp,fi);reset(inp);
readln(inp,n);
for i:=1 to n do
read(inp,a[i]);
close(inp);
end;
procedure init;
var i:longint;
begin
sum:=0;
for i:=1 to n do inc(sum,a[i]);
for i:=1 to n do adj[i]:=i;
adj[0]:=n;
adj[-1]:=n-1;
adj[n+1]:=1;
adj[n+2]:=2;
res:=high(longint);
end;
procedure back(i,dame,s:longint);
var j,down,d:longint;
stack:array[1..3] of longint;
begin
if dame>=res then exit;
down:=0;d:=0;
for j:=i-1 to i+1 do
if not check[adj[j]] then
begin
check[adj[j]]:=true;
inc(down,a[adj[j]]);
inc(d);
stack[d]:=adj[j];
end;
if s+down=sum then
begin
res:=min(res,dame);
for j:=1 to d do check[stack[j]]:=false;
exit;
end;
for j:=1 to n do
if not check[j] then
back(j,dame+sum-down-s,s+down);
for j:=1 to d do check[stack[j]]:=false;
end;
begin
input;
init;
for i:=1 to n do
back(i,0,0);
write(res);
end.