讨论 / 扩展物品却只得20分,大牛帮看看
852963 2009-05-31 03:07:00
点我顶贴 收藏 删除
program jiming;

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.

#1 小小小学生@2009-05-31 03:07:00
回复 删除
简单点说就是把那些物品组合起来

然后就在同一个主要物品 的不同组合之间选一个吧``` 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.

查看更多回复
提交回复