算法:DP
分析:这道题曾经做过的,是USACO上的一道题,其实就是个搜索+DP,也没什么新鲜的,但是不知道为什么就是老超时,只优化了一个地方,最后一个点通过需要1.34s……
program Vijos1159;
const
maxq=20000;
maxp=100;
var
p,q,tot,depth:longint;
a,sel:array [0..maxp] of longint;
f:array [0..maxq] of longint;
procedure init;
var
i:longint;
begin
tot:=0;
readln(q);
readln(p);
for i:=1 to p do readln(a[i]);
end;
procedure qsort(l,r:longint);
var
i,j,m,t:longint;
begin
i:=l;
j:=r;
m:=sel[(l+r) shr 1];
repeat
while sel[i]<m do inc(i);
while sel[j]>m do dec(j);
if i<=j then
begin
t:=sel[i];
sel[i]:=sel[j];
sel[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
procedure check;
var
i,j:longint;
begin
fillchar(f,sizeof(f),0);
f[0]:=1;
for i:=1 to tot do
begin
for j:=sel[i] to q do
inc(f[j],f[j-sel[i]]);
end;
if f[q]>0 then
begin
write(tot,' ');
qsort(1,tot);
for i:=1 to tot do write(sel[i],' ');
writeln;
close(input);
close(output);
halt;
end;
end;
procedure dfs(dep,st:longint);
var
i:longint;
begin
check;
if depth=dep then exit;
for i:=st to p do
begin
inc(tot);
sel[tot]:=a[i];
dfs(dep+1,st+1);
dec(tot);
end;
end;
procedure main;
var
i:longint;
begin
for i:=1 to p do
begin
depth:=i;
dfs(0,1);
end;
end;
begin
assign(input,'VJ1159.in'); reset(input);
assign(output,'VJ1159.out'); rewrite(output);
init;
main;
close(input); close(output);
end.