原题网址:http://codeforces.com/contest/687/problem/C
用f[i][j][k]=0/1表示用前i种货币,付出j圆,j圆中又有k圆是否可行。
方程:f[i][j][k]=f[i-1][j][k] or f[i-1][j-c[i]][k] or f[i-1][j-c[i]][k-c[i]]
注意不要MLE
var
f,g:array[-501..501,-501..501] of boolean;
c:array[0..501] of longint;
n,k,i,j,l,cnt,last:longint;
begin
read(n,k);
for i:=1 to n do read(c[i]);
fillchar(f,sizeof(f),false);
f[0][0]:=true;
for i:=1 to n do
begin
for j:=0 to k do
for l:=0 to k do
g[j][l]:=f[j][l] or f[j-c[i]][l] or f[j-c[i]][l-c[i]];
f:=g;
end;
cnt:=0;
for i:=0 to k do
if f[k][i] then
begin
inc(cnt);
last:=i;
end;
writeln(cnt);
for i:=0 to k do
if f[k][i] then
begin
if i=last
then writeln(i)
else write(i,' ');
end;
end.