当前位置: 首页 > news >正文

hdu 1561 树形dp+分组背包

题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值。

一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m)时选最多的宝物,而一个子节点中只可以选择一个状态进行转移,每个节点有若干个子节点,问题就转换为分组背包,几个子节点就是几个分组背包,体积是选几个地点,价值是宝物价值。      

状态转移方程: dp[v][1] = Money[v]; (v为叶子节点)
                   dp[v][j] = max(dp[v][j],dp[v][j-i] + dp[k][i] );(v为非叶子节点,j表示用户个数,i为容量,k为v的子节点,)

是不是分组背包都无所谓,直接按照方程来了,可能j的值是需要逆向枚举用到背包吧

 2015-05-11:

和bug那题一模一样,我会乱说?链接:点我

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****\n");
15 const int MAXN=1005;
16 int dp[MAXN][MAXN],val[MAXN],head[MAXN];
17 int n,m,tt,tot;
18 struct Edge
19 {
20     int to,next;
21 }edge[MAXN];
22 void addedge(int u,int v)
23 {
24     edge[tot].to=v;
25     edge[tot].next=head[u];
26     head[u]=tot++;
27 }
28 void init()
29 {
30     memset(head,-1,sizeof(head));
31     tot=0;
32     memset(dp,0,sizeof(dp));
33 }
34 void dfs(int u,int pre)
35 {
36     dp[u][1]=val[u];
37     for(int i=head[u];i!=-1;i=edge[i].next)
38     {
39         int v=edge[i].to;
40         if(v==pre)  continue;
41         dfs(v,u);
42         for(int j=m;j>=1;j--)
43         {
44             for(int k=1;j-k>=1;k++)
45             {
46                 dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
47             }
48         }
49     }
50 }
51 int main()
52 {
53     int i,j,k;
54     #ifndef ONLINE_JUDGE
55     freopen("1.in","r",stdin);
56     #endif
57     while(scanf("%d%d",&n,&m)!=EOF)
58     {
59         if(n==0&&m==0)  break;
60         init();
61         for(i=1;i<=n;i++)
62         {
63             int a;
64             scanf("%d%d",&a,&val[i]);
65             addedge(a,i);
66         }
67         m++;    //多了一个0节点
68         val[0]=0;
69         dfs(0,-1);
70         printf("%d\n",dp[0][m]);
71     }
72 }

 

转载于:https://www.cnblogs.com/cnblogs321114287/p/4325352.html

相关文章:

  • 我使出这“三板斧”(分段锁、哈希锁、弱引用锁)灭霸跑了......
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • zimbra 证书过期--zimbra使用
  • 编程之美 象棋将帅问题
  • 你会写单元测试吗
  • 一道题浅谈【作业调度】与【进程调度】
  • imagick-3.1.0RC2 安装错误
  • Taro 1.3 震撼发布:全面支持 JSX 语法和 HOOKS
  • Android Adapter
  • ognl表达式
  • 直播APP关于后期运营你知道多少?
  • 【新手向】vim快捷注释与删除操作
  • Maven搭建SpringMVC+Mybatis项目详解
  • Access restriction: The method createJPEGEncoder(OutputStream) from the type JPEGCodec is not access
  • 路由器简单的基础实验
  • @angular/forms 源码解析之双向绑定
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • express如何解决request entity too large问题
  • Javascript基础之Array数组API
  • js数组之filter
  • js写一个简单的选项卡
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • linux安装openssl、swoole等扩展的具体步骤
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Swoft 源码剖析 - 代码自动更新机制
  • XML已死 ?
  • 坑!为什么View.startAnimation不起作用?
  • 深度学习中的信息论知识详解
  • 关于Android全面屏虚拟导航栏的适配总结
  • 回归生活:清理微信公众号
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #DBA杂记1
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)德国人的记事本
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件_Git:.gitignore
  • .net 发送邮件
  • .Net 高效开发之不可错过的实用工具
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET4.0并行计算技术基础(1)
  • .Net8 Blazor 尝鲜
  • .Net中wcf服务生成及调用
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @Not - Empty-Null-Blank
  • @SuppressWarnings(unchecked)代码的作用
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ IO.File ] FileSystemWatcher
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证