网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月10日漏签0天
noip吧 关注:25,164贴子:642,092
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 2回复贴,共1页
<<返回noip吧
>0< 加载中...

pascal 树形动归题(分组背包) 求查错

  • 只看楼主
  • 收藏

  • 回复
  • cqj960808
  • 普及参赛
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

题目:
糖果
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的却过不了,比结果偏大,求解释。



  • us114514
  • 省选酱油
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
因为没有数据,所以不知道改的是否正确:
for j:=m downto 0 do
for k:=0 to j-2*cost[t] do
dp[v,j]:=max(dp[v,j],dp[v,j-2*cost[t]-k]+dp[y,k]);


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 2回复贴,共1页
<<返回noip吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示