这道题考的是树形dp+dfs+背包。
<0/1分组背包模型:http://blog.csdn.net/y91041/article/details/14224095>
下面是我的代码:
复制代码
除开这种做法,还有一种与选课相似的做法,转二叉树+背包。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64#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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复