var
n,m:longint;
k,i:integer;
vv,v,c,p,b:array[0..200] of longint;
f:array[0..32100] of longint;
begin
readln(n,m);
k:=0;
fillchar(b,sizeof(b),0);
fillchar(p,sizeof(p),0);
for i:=1 to m do
begin
read(c[i],v[i],p[i]);
vv[i]:=v[i]*c[i];
if p[i]=0 then continue else
if b[p[i]]<>0 then begin
inc(k);
c[m+k]:=c[p[i]]+c[b[p[i]]]+c[i];
vv[m+k]:=vv[p[i]]+vv[b[p[i]]]+vv[i];
inc(k);
c[m+k]:=c[p[i]]+c[i];
vv[m+k]:=vv[p[i]]+vv[i];
end
else begin
inc(k);
c[m+k]:=c[p[i]]+c[i];
b[p[i]]:=i;
vv[k+m]:=vv[i]+vv[p[i]];
end;
end;
m:=m+k;
fillchar(f,sizeof(f),0);
for i:=1 to m do
if p[i]=0 then
for k:=n downto c[i] do
if f[k]<f[k-c[i]]+vv[i] then f[k]:=f[k-c[i]]+vv[i];
//for i:=1 to m do
// writeln(i,’ ’,c[i],’ ’,vv[i]);
writeln(f[n]);
readln;
readln;
end.
然后就在同一个主要物品 的不同组合之间选一个吧``` program li;
var n,m,i,j,k,temp,max:longint;
w,v,x:array[0..60] of longint;
a,b:array[0..60,0..8] of longint;
f:array[-1..32001,-1..61] of longint;
begin
{reset(input);}
readln(n,m);
for i:=1 to m do read(v[i],w[i],x[i]);
{ close(input); }
for i:=1 to m do
if x[i]=0 then
begin
a[i,0]:=1; a[i,1]:=v[i]; b[i,1]:=v[i]*w[i];
end;
for i:=1 to m do
if x[i]<>0 then
begin
temp:=a[x[i],0]; a[x[i],0]:=a[x[i],0]*2;
for j:=1 to temp do
begin
a[x[i],temp+j]:=a[x[i],j]+v[i];
b[x[i],temp+j]:=b[x[i],j]+v[i]*w[i];
end;
end;
{ for i:=1 to n do
for j:=1 to m do
begin
max:=f[i,j-1];
if a[j,0]<>0 then
begin
for k:=1 to a[j,0] do
if i-a[j,k]>0 then
begin
if f[i-a[j,k],j-1]+b[j,k]>max then max:=f[i-a[j,k],j-1]+b[j,k];
f[i,j]:=max;
end else if f[i,j-1]>=f[i,j] then f[i,j]:=f[i,j-1];
end else
if j<>1 then f[i,j]:=f[i,j-1] else f[i,j]:=f[i-1,m];
end; }
for i:=1 to n do
for j:=1 to m do
begin
max:=f[i,j-1];
for k:=1 to a[j,0] do
if (i-a[j,k]>=0) then
if (f[i-a[j,k],j-1]+b[j,k]>max) then
max:=f[i-a[j,k],j-1]+b[j,k];
f[i,j]:=max;
end;
writeln(f[n,m]);
{ for i:=1 to n do
begin
for j:=1 to m do write(b[i,j]:4); writeln;
end;}
end.