讨论 / 哪里错了
庆卿清情 2009-10-24 01:29:00
点我顶贴 收藏 删除
type

tree=record

l,r:longint;

end;

var f:array[0..1024,0..109]of longint;

t:array[1..1024]of tree;

w,v:array[1..1024]of longint;

i,n,m,x:longint;

procedure dp(i,j:longint);

var k:longint;

function max(x,y:longint):longint;

begin

if x>y then

exit(x) else exit(y);

end;

begin

if i=0 then exit;

if f[i,j]<>0 then exit;

if (j>=v[i])and(w[i]>0) then

begin

dp(t[i].r,j-v[i]);

f[i,j]:=f[t[i].r,j-v[i]]+w[i];

end;

for k:=0 to j do

begin

dp(t[i].l,k);

dp(t[i].r,j-k);

f[i,j]:=max(f[i,j],f[t[i].l,k]+f[t[i].r,j-k]);

end;

end;

begin

readln(n,m);

for i:=2 to n do

begin

read(x);

if t[x].l=0 then

t[x].l:=i else

begin

x:=t[x].l;

while t[x].r<>0 do

x:=t[x].r;

t[x].r:=i;

end;

end;

for i:=1 to n do

read(v[i]);

for i:=1 to n do

read(w[i]);

dp(1,m);

writeln(f[1,m]);

end.

查看更多回复
提交回复