概述
即在树上做背包
#include<cstdio>
#include<cstring>
#include<algorithm>
using
namespace
std;
struct
my{
int
next;
int
v;
};
const
int
maxn=1000+10;
int
adj[maxn],fa,n,m,dp[maxn][maxn];
my bian[maxn*2];
int
score[maxn];
void
myinsert(
int
u,
int
v){
bian[++fa].v=v;
bian[fa].next=adj[u];
adj[u]=fa;
}
void
dfs(
int
x){
dp[x][0]=0;
for
(
int
i=adj[x];i!=-1;i=bian[i].next){
int
v=bian[i].v;
dfs(v);
for
(
int
t=m;t>=0;t--){
for
(
int
j=t;j>=0;j--){
if
(t-j>=0)
dp[x][t]=max(dp[x][t],dp[x][t-j]+dp[v][j]);
}
}
}
if
(x!=0){
for
(
int
t=m;t>0;t--){
dp[x][t]=dp[x][t-1]+score[x];
}
}
}
int
main(){
int
v;
memset
(adj,-1,
sizeof
(adj));
memset
(bian,-1,
sizeof
(bian));
scanf
(
"%d%d"
,&n,&m);
for
(
int
i=1;i<=n;i++){
scanf
(
"%d%d"
,&v,&score[i]);
myinsert(v,i);
// myinsert(i,v);
}
dfs(0);
printf
(
"%d"
,dp[0][m]);
return
0;
}
转载于:https://www.cnblogs.com/lmjer/p/9418929.html
最后
以上就是碧蓝心情为你收集整理的选课(背包类树形dp)的全部内容,希望文章能够帮你解决选课(背包类树形dp)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复