题目描述:...

解法:

    树形dp+分组背包。

    dp[i][j]记录以i为根的子树分配j个用户时的最大收益,cnt[i]记录以i为根的子树有几个叶子节点,对于每个i,背包容量即为cnt[i]的大小。

    将i的每个子节点看作一组,这组背包的物品重量即为1~cnt[son[i]],由于只能从每组中选出一种物品,所以可以看做分组背包。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #define N 3010
 6 using namespace std;
 7 const int inf=(1<<30);
 8 struct Edge{
 9     int next,len;
10 };
11 vector<Edge>V[N];
12 int dp[N][N];
13 int cnt[N];
14 void init(){
15     for(int i=1;i<N;i++)V[i].clear();
16     for(int i=0;i<N;i++)
17         for(int j=0;j<N;j++)
18             dp[i][j]=-inf;
19     for(int i=0;i<N;i++)
20         dp[i][0]=0;
21     memset(cnt,0,sizeof(cnt));
22 }
23 int dfs(int n){
24     if(cnt[n]!=0)return  cnt[n];
25     cnt[n]=0;
26     for(int i=0;i<V[n].size();i++){
27         dfs(V[n][i].next);
28         cnt[n]+=cnt[V[n][i].next];
29     }
30     return cnt[n];
31 }
32 void DP(int n){
33     if(V[n].size()==0)
34         return ;
35     for(int i=0;i<V[n].size();i++){
36         DP(V[n][i].next);
37         for(int k=cnt[n];k>=1;k--)
38             for(int j=1;j<=cnt[V[n][i].next];j++)
39             if(k>=j)
40                 dp[n][k]=max(dp[n][k],dp[n][k-j]+dp[V[n][i].next][j]+V[n][i].len);
41
42     }
43 }
44 int main(){
45     int n,m;
46     while(cin>>n>>m){
47         init();
48         for(int i=1;i<=n-m;i++){
49             int k,a,c;
50             cin>>k;
51             while(k--){
52                 cin>>a>>c;
53                 Edge E;
54                 E.next=a;E.len=-c;
55                 V[i].push_back(E);
56             }
57         }
58         for(int i=n-m+1,j=1;i<=n;i++,j++){
59             int c;
60             cin>>c;
61             dp[i][1]=c;
62             cnt[i]=1;
63         }
64         dfs(1);
65         DP(1);
66         for(int i=cnt[1];i>=1;i--)
67             if(dp[1][i]>=0){
68                 cout<<i<<endl;
69                 break;
70             }
71     }
72     return 0;
73 }

转载于:https://www.cnblogs.com/silver-bullet/archive/2012/10/29/2745400.html

poj 1155 TELE相关推荐

  1. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  2. POJ 1155 TELE【树形DP】

    POJ 1155 TELE http://poj.org/problem?id=1155 大意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端, 其余点为转发站.客户端i ...

  3. DP Intro - Tree DP Examples

    因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下) 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意:给你一棵树 ...

  4. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  5. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

  6. 树形DP --算法竞赛专题解析(17)

    本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 网购:京东 当当      想要一本作者签名书?点我 如有建议, ...

  7. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

  8. POJ 3268 D-Silver Cow Party

    http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  9. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

最新文章

  1. ROS kinetic安装、Kinect2驱动安装和配置
  2. React 数字取整
  3. 这些常识一直在损害健康
  4. 相机位姿估计2:[应用]实时位姿估计与三维重建相机姿态
  5. Android Studio报Element XXXX must be declared的解决方法
  6. oracle误删数据的解决方法
  7. 装了卡巴后VS 2003不能启动调试错误的解决方案
  8. Python基础入门_5面向对象基础
  9. JavaScript之常用方法讲解
  10. asp.net 使用Master模板页需要注意
  11. G盘文件系统RAW要怎么办啊
  12. Beta阶段第四次Scrum Meeting
  13. 使用wePE安装系统
  14. ADAMS并联机器人动力学仿真【附源文件】
  15. matlab编写正弦波mif,使用MATLAB一键制作mif文件
  16. excel单元格的引用
  17. deb文件如何安装(安装文件管理器)
  18. IIS如何添加MIME类型.svg/.woff2/.woff
  19. Photoshop CS2 视频教程-PS合并图层(转)
  20. 【毕设记录日记】深度学习|铝型材表面缺陷视觉检测算法:YOLOv5环境搭建、基础知识、问题解决、优化方法

热门文章

  1. mac的python怎么输入中文_无法在python IDE(Mac OS X)中输入unicode
  2. 《计算机应用基础实训教程》,《计算机应用基础实训教程》修改稿(文).doc
  3. 连接linux系统的mysql,Linux系统MySQL开启远程连接
  4. flask对mysql数据库增删改查_flask后台框架1.4(mysql配置+数据库增删改查)-Go语言中文社区...
  5. java exe 路径_Java程序获取执行自己的java.exe路径
  6. php 图片叠加,thinkPHP5 生成海报(图片叠加定位)
  7. java io流屏幕输出_java IO流 之 输出流 OutputString()的使用
  8. 等离子显示器测试软件,等离子电视各种屏自检方法分享
  9. linux块设备驱动编写,Linux内核学习笔记 -49 工程实践-编写块设备驱动的基础
  10. php 获取子类的方法名,php获取分类下的所有子类方法