help!!!help!!!求依赖背包代码
pascal吧
全部回复
仅看楼主
level 9
鸭神大人 楼主
怎么破怎么破,,,,
依赖背包
描述 Description
你有n个物品,每个物品有一个价值和体积
每个物品可能有一个依赖物品,也可能没有
对于有依赖物品的物品,若选该物品这必须选他所依赖的物品
题目保证依赖关系不形成环
现要求你从这n个物品中选出若干个满足依赖关系
并且它们的体积和不超过V
求它们的最大价值和
输入格式 Input Format
第一行n,V(n,V<=200),含义如题目所示
接下来n行
第i+1行三个数w[i],v[i],k[i],描述第i个物品的价值,体积和依赖物品
0<=k[i]<=n,若k[i]=0表示该物品没有依赖物品
输入数据保证合法
输出格式 Output Format
一个数,即能得到最大价值和
样例输入 Sample Input
4 60
753 14 4
37 9 0
966 42 2
38 22 3
样例输出 Sample Output
1003
2015年04月14日 12点04分 1
level 9
鸭神大人 楼主
我的代码只能过85.。。。。
代码如下
program p1813;
var n,v,h,i,j,m,min:longint;
w,x,k,ans,y:array[0..200] of longint;
dui:array[0..200,0..200] of longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
function find(a:longint):longint;
begin
if k[a]=a then exit(a);
k[a]:=find(k[a]);
exit(k[a]);
end;
procedure change(var a,b:longint);
var t:longint;
begin
t:=a;
a:=b;
b:=t;
end;
procedure sort(a,l,r:longint);
var i,j,mid:longint;
begin
i:=l;j:=r;mid:=x[dui[a,(i+j) div 2]];
while i<=j do
begin
while x[dui[a,i]]<mid do inc(i);
while x[dui[a,j]]>mid do dec(j);
if i<=j then
begin
change(dui[a,i],dui[a,j]);
inc(i);
dec(j);
end;
end;
if j>l then sort(a,l,j);
if i<r then sort(a,i,r);
end;
procedure one(a:longint);
var i,t,p:longint;
map:array[0..200] of longint;
begin
fillchar(map,sizeof(map),0);
p:=1;t:=1;
map[p]:=y[a];
while p<=t do
begin
for i:=1 to n do
if (k[i]=map[p])and (i<>map[p]) then
begin
inc(t);
map[t]:=i;
x[map[t]]:=x[map[t]]+x[map[p]];
w[map[t]]:=w[map[t]]+w[map[p]];
k[map[t]]:=find(map[t]);
end;
inc(p);
end;
dui[a,0]:=0;
for i:=1 to t do
if x[map[i]]<=v then
begin
inc(dui[a,0]);
dui[a,dui[a,0]]:=map[i];
end;
sort(a,1,dui[a,0]);
end;
begin
assign(input,'p1813.in');
assign(output,'p1813.out');
reset(input);
rewrite(output);
read(n,v);h:=0;
for i:=1 to n do
begin
read(w[i],x[i],k[i]);
if k[i]=0 then
begin
inc(h);
y[h]:=i;
k[i]:=i;
end;
end;
for i:=1 to h do
one(i);
min:=0;
fillchar(ans,sizeof(ans),0);
for i:=1 to h do
for j:=v downto 0 do
for m:=1 to dui[i,0] do
if j>=x[dui[i,m]]then
begin
ans[j]:=max(ans[j],ans[j-x[dui[i,m]]]+w[dui[i,m]]);
min:=max(min,ans[j]);
end;
writeln(min);
close(input);
close(output);
end.
2015年04月14日 13点04分 2
level 6
楼主真弱(其实我就是来水的哈哈哈哈)
2015年04月14日 13点04分 3
呃呃呃。。小胡同学你要不要这样
2015年04月14日 13点04分
level 1
我说LZ的ID怎么略眼熟,这不是吴熙炜吗。[喷][喷]
2015年04月15日 13点04分 4
豪爷你要干些啥
2015年04月15日 13点04分
level 1
pascal吧……
2015年05月03日 01点05分 5
1