zoukankan      html  css  js  c++  java
  • 选课(背包类树形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;
    }
  • 相关阅读:
    Web全栈探索,Vue基础系列,前后端交互(四)
    幸运者
    整数加法
    猜数游戏
    multi-select 左右选择插件
    Layui 踩坑记录
    jQuery 封装公共方法
    前后端文件内容 md5 计算
    Apscheduler 定时任务
    Git 开发流程
  • 原文地址:https://www.cnblogs.com/lmjer/p/9418929.html
Copyright © 2011-2022 走看看