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

    题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个房间里有一个代价,代价是值/20个士兵,

    同时有一个价值,问你花费这m个士兵可以得到的最大价值是多少

    定义dp[i][j]表示根结点为i时,用掉j个士兵获得的最大possible。

    dp[i][j] = max(dp[i][j], dp[i][j-k] + dp[son[i]][k]);

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    vector <int> g[120];
    int n,m;
    int dp[120][120];
    int num[120],val[120];
    void dfs(int u,int fa)
    {
        int i,j,k;
        int v;
        for(i=num[u];i<=m;i++) dp[u][i]=val[u];
        for(i=0;i<g[u].size();i++)
        {
            v=g[u][i];
            if(v==fa) continue;
            dfs(v,u);
            for(j=m;j>=num[u];j--)
                for(k=1;k<=j-num[u];k++)
                    dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m),n!=-1&&m!=-1)
        {
            int i,j,x,y;
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&x,&y);
                x=(x+19)/20;
                num[i]=x;
                val[i]=y;
            }
            memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++) g[i].clear();
            for(i=1;i<n;i++)
            {
                scanf("%d%d",&x,&y);
                g[x].push_back(y);
                g[y].push_back(x);
            }
            if(m==0) {printf("0
    ");continue;}
            dfs(1,-1);
            printf("%d
    ",dp[1][m]);
        }
        return 0;
    }
  • 相关阅读:
    ArcGIS添加鹰眼
    C#设计模式--工厂方法
    C#设计模式--简单工厂
    C# 单例模式(转)
    事务的 原子性、一致性、隔离性、持久性
    asp.net 常用的3中身份验证
    angular localStorage使用方法
    angular.js升序降序过滤器
    ionic中$ionicPopover和$ionicModal
    ionic的弹出框$ionicPopover
  • 原文地址:https://www.cnblogs.com/vermouth/p/3957770.html
Copyright © 2011-2022 走看看