hdu 1561 树形dp+分组背包
2015-05-11 23:35
288 查看
题意:就是给定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那题一模一样,我会乱说?链接:点我
一个子节点就可以返回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那题一模一样,我会乱说?链接:点我
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 const int INF=0x3f3f3f3f; const double eps=1e-5; typedef long long ll; #define cl(a) memset(a,0,sizeof(a)) #define ts printf("*****\n"); const int MAXN=1005; int dp[MAXN][MAXN],val[MAXN],head[MAXN]; int n,m,tt,tot; struct Edge { int to,next; }edge[MAXN]; void addedge(int u,int v) { edge[tot].to=v; edge[tot].next=head[u]; head[u]=tot++; } void init() { memset(head,-1,sizeof(head)); tot=0; memset(dp,0,sizeof(dp)); } void dfs(int u,int pre) { dp[u][1]=val[u]; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(v==pre) continue; dfs(v,u); for(int j=m;j>=1;j--) { for(int k=1;j-k>=1;k++) { dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); } } } } int main() { int i,j,k; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; init(); for(i=1;i<=n;i++) { int a; scanf("%d%d",&a,&val[i]); addedge(a,i); } m++; //多了一个0节点 val[0]=0; dfs(0,-1); printf("%d\n",dp[0][m]); } }
相关文章推荐
- hdu 1561树形dp+分组背包
- hdu1561 The more, The Better 树形DP+分组背包
- HDU 1561 The more, The Better (树形DP+背包)
- HDU 1561 (树形DP+背包)
- hdu 1561 The more, The Better(树形dp+背包)
- hdu1561 The more, The Better(常见分组背包+树形dp)
- hdu 1561 The more, The Better(树形DP+背包)两种建树方式都对
- hdu 4044 GeoDefense 树形dp+分组背包
- hdu 4003 树形dp+分组背包
- hdu 4003 Find Metal Mineral 树形dp+分组背包
- HDU 1561 树形dp+背包
- hdu 1561(树形DP+背包)
- HDU 1561 The more, The Better(树形dp+背包)
- hdu 4003 树形dp+分组背包
- hdu 1561 (树形dp+依赖背包)
- hdu1561 The more, The Better(树形dp+有依赖的背包)
- [HDU] 1561 The more, The Better 树形DP加01分组背包
- HDU-1561-树形dp+背包
- HDU - 4044 J - GeoDefense 【树形DP+分组背包】
- hdu 4003 Find Metal Mineral(树形DP+分组背包,每个物品必须只能选一次)