CDOJ 1136 树形01背包
来源:互联网 发布:ubuntu 14.04 下载 编辑:程序博客网 时间:2024/06/15 20:10
dp[u][i]表示在以u为根节点的子树上,选i个物品的最大价值。
然后转移方程就是dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]),就是他可以从当前已更新的部分选j-k个,然后在要更新的那个儿子节点那里选k个,v是当前更新到的子节点,这样把k从1到j-1扫一遍,就把这个子节点更新了。
#include<bits/stdc++.h>using namespace std;const int maxn=205;const int maxm=205;struct node{ int to,next;}E[maxm];int head[maxn],tot;int n,m;int v[maxn],dp[maxn][maxn];void add(int u,int v){ E[tot].to=v; E[tot].next=head[u]; head[u]=tot++;}void init(){ memset(head,-1,sizeof(head)); tot=0; memset(E,0,sizeof(E)); memset(dp,0,sizeof(dp));}void dfs(int x){ dp[x][1]=v[x]; for(int i=head[x];i!=-1;i=E[i].next){ int to=E[i].to; dfs(to); for(int j=m;j>=0;j--){ for(int k=0;k<j;k++){ dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[to][k]); } } }}int main(){ while(~scanf("%d%d",&n,&m)){ if(n==0&&m==0)break; m++; init(); int a; for(int i=1;i<=n;i++){ scanf("%d%d",&a,&v[i]); add(a,i); } dfs(0); printf("%d\n",dp[0][m]); } return 0;}
0 0
- CDOJ 1136 树形01背包
- CDOJ 1136 邱老师玩游戏 树形01背包
- CDOJ 1136 邱老师玩游戏 树形01背包 (有依赖的背包问题)
- cdoj 1136 邱老师玩游戏 树形背包
- CDOJ 1133 菲波拉契数制 01背包
- cdoj 31 饭卡(card) 01背包
- CDOJ 1351(树形DP)
- hdu1561树形dp 01背包
- poj 1155 树形DP 01背包
- 树形DP +01背包(HDU 1011)
- POJ-1947-树形dp+01背包
- [poj1155] TELE 树形DP 01背包
- CDOJ 1348柱爷与咸鱼神功(裸01背包)
- CDOJ 1136(数位DP)
- 浅谈树形背包问题
- POJ 1947 树形背包
- hdu 1011 树形背包
- hdu 1011 树形背包
- mybatis查询类型为int的字段,返回null的异常
- POJ 1651 Multiplication Puzzle (区间DP OR 记忆化搜索)
- 【目标跟踪】KCF高速跟踪详解
- 洛谷P2760 科技庄园(dp)
- Android的UI主线程是ActivityThread吗?
- CDOJ 1136 树形01背包
- sql 使用视图的好处
- Treasure of the Chimp Island (BFS
- BFS系列(二)
- XTU 1250 Super Fast Fourier Transform
- HDU 1026 Ignatius and the Princess I(广搜+优先队列)
- zzuli 2127 tmk射气球
- JSP_9th_读写JavaBean
- 特征点匹配——ORB算法介绍