我是靠谱客的博主 碧蓝心情,最近开发中收集的这篇文章主要介绍选课(背包类树形dp),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

即在树上做背包

#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)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部