47 lines
1.1 KiB
ObjectPascal

var
n,i,r,c:longint;
min,s,l,a:array[0..7001] of longint;
procedure print;
var
i:longint;
begin
write(l[1]);
for i:=2 to r do write(' ',l[i]);
close(input);close(output);
halt;
end;
procedure find(x,z:longint);
begin
if z=c then print;
if (x<=n) and (z+min[x]<=c) and (z+s[x]>=c) then
begin
if z+a[x] <= c then
begin
inc(r);
l[r]:=a[x];
find(x+1,z+a[x]);
dec(r);
end;
find(x+1,z);
end;
end;
begin
assign(input,'subsum.in');reset(input);
assign(output,'subsum.out');rewrite(output);
read(n,c);
for i:=1 to n do read(a[i]);
min[n]:=a[i];
s[n]:=a[i];
for i:=n-1 downto 1 do
begin
if a[i] < min[i+1] then min[i]:=a[i]
else min[i]:=min[i+1];
s[i]:=s[i+1]+a[i];
end;
find(1,0);
writeln('No Solution!');
close(input);close(Output);
end.