题目:
糖果
Case Time Limit:1S
Case Memory Limit:64M
Description
万圣节那天,小Q想去邻居要糖果,玩下“Trick or
Treat”。小Q家和邻居家够成一棵树,即邻居间可以相互到达,并且只有一种方案。小Q的妈妈将在m分钟后回来,如果发现小Q不在家会很生气。小Q希望获得最多的糖果,并且在m分钟内回到家中。现在告诉你每条路要花的时间,并假设小Q到了邻居家后就能拿到糖果,不需要花时间,当然每个邻居只会给一次糖果,以后经过的时候,就不再给了。请你帮她算算,她最多能拿到多少糖果。
Input
输入文件candy.in
输入数据一行,一个正数n表示小Q所在的敌方有多少户人家。
接下一行n个数,表示每户人家给她的糖数vali。
接下来n-1,每行三个数,a,b,c,表示通过连接编号为a,b的人家的路要花费c分钟的时间,1<=a,b<=n。
最后一行,两个整数k,m,k表示小Q家的编号(小Q也能从自己家获得糖果),m表示妈妈m分钟后回家。
Output
输出文件candy.out
输出一个整数表示小Q能获得最多糖果数量。
Sample Input
样例一输入
2
1 3
2 1 1
2 1
样例二输入
2
3 3
1 2 1
2 2
Sample Output
样例一输出
3
样例一输出
6
Hint
样例一解释:小Q只能获得自己家的糖果,不能在m分钟去其他的地方再赶回来。
样例二解释:小Q能获得自己家的糖果和编号为1邻居家的糖果,并恰好在m分钟赶回家中。
对于30%的数据1<=n<=10;
对于100%的数据,1<=n<=100,1<=m<=200 ,0<=vali <=1000,1<=c<=10;
code:
program candy;
var n,m,k,a,b,c,tot,i,j:longint;
head,val,cost,ti,next:array[1..1000] of longint;
dp:array[1..200,0..300] of longint;
procedure add(a,b,c:longint);
begin
ti[tot]:=b;
cost[tot]:=c;
next[tot]:=head[a];
head[a]:=tot;
inc(tot);
end;
function max(p,q:longint):longint;
begin
if p>q then max:=p
else max:=q;
end;
procedure dfs(v,fa:longint);
var i,j,y,k,t:longint;
begin
i:=head[v];
while i<>-1 do
begin
y:=ti[i];
t:=i;
i:=next[i];
if y=fa then continue;
dfs(y,v);
for j:=m downto 0 do
for k:=0 to j-2*cost[i] do
dp[v,j]:=max(dp[v,j],dp[v,j-2*cost[t]-k]+dp[y,k]);
end;
for j:=0 to m do
dp[v,j]:=dp[v,j]+val[v];
end;
begin
//assign(input,'candy.in');reset(input);
//assign(output,'candy.out');rewrite(output);
readln(n);
tot:=0;
for i:=1 to n do head[i]:=-1;
for i:=1 to n do read(val[i]);
for i:=1 to n-1 do
begin
readln(a,b,c);
add(a,b,c);
add(b,a,c);
end;
readln(k,m);
for i:=1 to n do
for j:=0 to m do
dp[i,j]:=0;
dfs(k,0);
writeln(dp[k,m]);
readln;
//close(input);
//close(output);
end.
1..10的数据我过了,1..100的却过不了,比结果偏大,求解释。