zoukankan      html  css  js  c++  java
  • 树形背包——hdu1561

    题目链接

    题目含义

    第一行给出城堡个数N和背包容量M

    第i+1行给出i的父亲以及i的权值

    求装m个城堡能得到的最大权值

    题目分析

    入门的树形背包

    题目代码

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    const int maxn=300;
    const int INF=0x3f3f3f3f;
    struct node{
        int to;
        int next;
    }edge[maxn<<1];
    int head[maxn],dp[maxn][maxn],val[maxn];
    int n,m,tot,a,b;
    void add(int u,int v){
        edge[tot].to=v;
        edge[tot].next=head[u];
        head[u]=tot++;
    }
    void dfs(int u){
        dp[u][1]=val[u];
        for(int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].to;
            dfs(v);
            for(int j=m;j>0;j--)
            for(int k=0;k<j;k++){
                dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
            }
        }
    }
    int main(){
        while(scanf("%d%d",&n,&m)){
            if(n==0&&m==0)return 0;
            memset(dp,0,sizeof(dp));
            memset(head,-1,sizeof(head));
            tot=0;
            for(int i=1;i<=n;i++){
                scanf("%d%d",&a,&b);
                add(a,i);
                val[i]=b;
            }
            m++;
            val[0]=0;
            dfs(0);
            printf("%d
    ",dp[0][m]);
        }
    }
  • 相关阅读:
    C语言ll作业01
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
    C语言I作业12—学期总结
    C语言I博客作业11
    C语言I博客作业10
    C语言I博客作业08
    C语言寒假大作战02
  • 原文地址:https://www.cnblogs.com/helman/p/11266292.html
Copyright © 2011-2022 走看看