树形依赖背包(codevs1155 金明的预算方案 2006年NOIP全国联赛提高组)

http://codevs.cn/problem/1155/


dfs自然的生成依赖关系

然后搜索前update

搜索后dp转移一下

为了方便,令root=0

将森林构建成树

具体看代码


#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
inline void read(int &ans){
  ans=0;char x=getchar();int f=1;
  while(x<'0'||x>'9'){if(x=='-')f=-1;x=getchar();}
  while(x>='0'&&x<='9')ans=ans*10+x-'0',x=getchar();
  ans*=f;
}
const int MAXN=60+10;
const int MAXM=30000+10;
struct node{int v,next;}E[MAXN<<1];
int head[MAXN<<1],tot,val[MAXN],cost[MAXN],n,m,ans,F[MAXN][MAXM];
void add(int u,int v){E[++tot]=(node){v,head[u]},head[u]=tot;}

void dfs(int u,int fa,int M){
  if(M>0)
    for(int i=head[u];~i;i=E[i].next){
      int v=E[i].v;
      if(v!=fa){
	for(int j=0;j<=m-cost[v];++j)
	  F[v][j]=F[u][j]+cost[v]*val[v];
	dfs(v,u,m-cost[v]);
	for(int j=cost[v];j<=m;++j)
	  F[u][j]=max(F[u][j],F[v][j-cost[v]]);
      }
    }
}

int v;
int main(){
  read(m),read(n);
  memset(head,-1,sizeof(head));
  for(int i=1;i<=n;i++)
    read(cost[i]),read(val[i]),read(v),add(i,v),add(v,i);
  dfs(0,0,m);
  printf("%d\n",F[0][m]);
  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值