zoukankan      html  css  js  c++  java
  • hdu 1011 Starship Troopers

    /*
        树形dp
        题意:
        给出一颗树,每一个节点都有敌人,消灭敌人后会给酬劳,自己的士兵一个能消灭20个,从节点1開始,假设根节点消灭。子节点就不消灭
        给出一个n表示有n个节点,m表示自己士兵的数量。接下来n行,表示n个节点敌人的数量和酬劳,接下来n-1行是树的情况
    */
    #include<stdio.h>
    #include<string.h>
    const int maxn = 105;
    int N,M,first[maxn],next[maxn<<1],bug[maxn],fra[maxn],ne,flag[maxn],dp[maxn][maxn];//dp[i][j]表示以i为跟节点的子树安排j个士兵的最大价值,first。next是邻接表,bug,fra是节点的敌人和酬劳,
    struct Edge
    {
        int u,v;
        void set(int u,int v)
        {
            this->u=u;
            this->v=v;
        }
    }ed[maxn<<1];
    void add_Edge(int u,int v)
    {
        ed[ne].set(u,v);
        next[ne]=first[u];
        first[u]=ne++;
    }
    void dfs(int u)
    {
        flag[u]=1;
        int temp=(bug[u]+19)/20;
        for(int i=temp;i<=M;i++) dp[u][i]=fra[u];
        for(int i=first[u];i+1;i=next[i])
        {
            int v=ed[i].v;
            if(flag[v]) continue;
            dfs(v);
            for(int j=M;j>=temp;j--)//由于是一直在一次for循环中。一直都是u。和v,所以要想0,1背包的一维一样从大的開始。这样就避免了反复装
            {
                for(int k=1;k<=j-temp;k++)
                    if(dp[u][j]<dp[u][j-k]+dp[v][k])//由于无论u的其它子节点是否排了人,当前这个点v一定没有排人
                        dp[u][j]=dp[u][j-k]+dp[v][k];
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&N,&M)!=EOF&&(N+1))
        {
            for(int i=1;i<=N;i++)
                scanf("%d%d",&bug[i],&fra[i]);
            ne=0;
            memset(first,-1,sizeof(first));
            memset(dp,0,sizeof(dp));
            memset(flag,0,sizeof(flag));
            for(int i=0;i<N-1;i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                add_Edge(u,v);
                add_Edge(v,u);
            }
            if(M==0)
            {
                printf("0 ");
                continue;
            }
            dfs(1);
            printf("%d ",dp[1][M]);
        }
        return 0;
    }

  • 相关阅读:
    P3387 【模板】缩点 tarjan
    P2831 愤怒的小鸟 状压dp
    交流帖
    P3959 宝藏 模拟退火。。。
    B1060 [ZJOI2007]时态同步 dfs
    P1850 换教室 概率dp
    树链刨分(待修改)
    B3403 [Usaco2009 Open]Cow Line 直线上的牛 deque
    B3402 [Usaco2009 Open]Hide and Seek 捉迷藏 最短路
    B5248 [2018多省省队联测]一双木棋 状压dp
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6760631.html
Copyright © 2011-2022 走看看