概述
这道题考的是树形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>
最后
以上就是彩色钢笔为你收集整理的hdu 1561 树形dp+背包+dfs的全部内容,希望文章能够帮你解决hdu 1561 树形dp+背包+dfs所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复