47 lines
1.1 KiB
ObjectPascal
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.
|