max:longint;
ss,c,e:array[1..1024] of integer;
f:array[0..109] of longint;
b:array[1..109] of boolean;
bb:array[0..109,0..1024] of boolean;
s:array[0..109,0..1025] of boolean;
function have(p,w:integer):boolean;
var i:integer;
begin
i:=p;
while i<>0 do begin
if bb[w,i] then exit(true);
i:=ss[i];
end;
have:=false;
end;
begin
readln(n,m);
ss[1]:=0;
for i:=2 to n do read(ss[i]);
for i:=1 to n do read(c[i]);
for i:=1 to n do begin read(e[i]); end;
for i:=0 to m do for j:=0 to n do s[i][j]:=true;
for i:=1 to n do
for j:=m downto c[i] do
if ((f[j]<f[j-c[i]]+e[i])or(not b[j]))and(s[j-c[i]][i])and(not have(i,j-c[i])) then begin
f[j]:=f[j-c[i]]+e[i];
b[j]:=true;
for k:=1 to n do bb[j,k]:=bb[j-c[i],k]; bb[j,i]:=true;
k:=ss[i];
while (k<>0) do begin
s[j][k]:=false;
k:=ss[k];
end;
end;
max:=-maxlongint;
for i:=1 to m do if max<f[i] then max:=f[i];
writeln(max);
end.
按普通01背包解得,就是加了点条件