hdu 1561 树形dp+背包+dfs

来源:互联网 发布:mac ssh sftp 客户端 编辑:程序博客网 时间:2024/06/05 19:51

这道题考的是树形dp+dfs+背包。

<0/1分组背包模型:http://blog.csdn.net/y91041/article/details/14224095>

下面是我的代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int size;int f[252][250];int n,m;int a[250];struct node{int to,next;};node e[62505];int head[250];bool visit[252];void dp(int v){visit[v]=true;  for(int i=head[v];i;i=e[i].next) //存储的是有向边  {  if(!visit[e[i].to])  {     dp(e[i].to);  }  for (int j=m;j>=2;j--)            for (int k=1;k<j;k++)     if(f[e[i].to][j-k]!=-1&&f[v][k]!=-1)                f[v][j] = max( f[v][j]  ,  f[e[i].to][j-k]+f[v][k] );   }}void tjb(int x,int y){size++;e[size].next=head[x];head[x]=size;e[size].to=y;}int main(){cin>>n>>m;while(n!=0||m!=0){size=0;memset(a,0,sizeof(a));memset(head,0,sizeof(head));for(int i=1;i<=n;i++){int x;cin>>x>>a[i];tjb(x,i);}memset(f,-1,sizeof(f));memset(visit,0,sizeof(visit));    for (int j=n;j>=0;j--)           f[j][0]=0,f[j][1]=a[j];    m++;dp(0);cout<<f[0][m]<<endl;cin>>n>>m;}return 0;}
除开这种做法,还有一种与选课相似的做法,转二叉树+背包。

<推荐:http://blog.csdn.net/whyorwhnt/article/details/9491575>