这个是附件数量增加都能AC的代码
h[i,j]数组表示:第i个主件的第j个附件加上前面所选的附件与主件的价格之和
g[i,j]数组表示:第i个主件的第j个附件加上前面所选的附件与主件的重视值与价格乘积之和
s[i]数组表示:将附件的q[i]指向h[]数组的位置
var n,m,i,j,k,t:longint;
v,p,q:array[0..1000] of longint;
f,s:array[0..32000] of longint;
h,g:array[0..400,0..2000] of longint;
function max(x,y:longint):longint;
begin
if (x>y) then exit(x) else exit(y);
end;
begin
fillchar(f,sizeof(f),0);
fillchar(h,sizeof(h),0);
fillchar(g,sizeof(g),0);
fillchar(s,sizeof(s),0);
readln(n,m);
k:=0;
for i:=1 to m do
begin
readln(v[i],p[i],q[i]);
p[i]:=p[i]*v[i];
if (q[i]=0) then //如果是主件,就将主件的编号转化,将主件有顺序的储存在h[i,j]中
begin
inc(k); s[i]:=k;
h[k,0]:=1;
h[k,1]:=v[i]; g[k,1]:=p[i];
end;
end;
//这里是将附件绑在主件上的各种情况展开,并记录在数组h,g中
for i:=1 to m do
if (q[i]<>0) then
begin
for j:=h[s[q[i]],0]+1 to 2*h[s[q[i]],0] do
begin
h[s[q[i]],j]:=h[s[q[i]],j-h[s[q[i]],0]]+v[i];
g[s[q[i]],j]:=g[s[q[i]],j-h[s[q[i]],0]]+p[i];
end;
h[s[q[i]],0]:=2*h[s[q[i]],0];
end;
//---------动态规划---------
for i:=1 to k do
for j:=n downto 1 do
begin
for t:=1 to h[i,0] do
if (h[i,t]<=j) then
f[j]:=max(f[j],f[j-h[i,t]]+g[i,t]);
end;
writeln(f[n]);
end.