我是靠谱客的博主 碧蓝心情,这篇文章主要介绍选课(背包类树形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)内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部