讨论 / 如果附件数量增加,本题可做吗?
cotton 2012-05-04 03:13:00
点我顶贴 收藏 删除
RT,要是把最大附件数增加到k,还有办法做吗?
#1 xyshh94225@2011-07-13 23:09:00
回复 删除
当然是可做的。。。

就算是树形依赖背包都可以O(nv)做的。。。。。

而这个比树形简单很多的。

#2 流光一瞬@2012-05-04 03:13:00
回复 删除
如果附件数量增加,本题也可做

这个是附件数量增加都能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.

查看更多回复
提交回复