讨论 / 求查错
liangjs 2012-07-06 00:58:00
点我顶贴 收藏 删除
var i,j,m,k,n:integer;

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背包解得,就是加了点条件

查看更多回复
提交回复