-
B - Binary Apple Tree
- URAL - 1018
- 这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果
- dp[i][j]来表示第i个节点保留j个树枝的最大苹果数。树形dp搜索父子关系,以树枝数为容量dp存的为苹果数进行背包dp即可
-
#include<stdio.h> #include<iostream> #include<cstring> using namespace std; #define maxn 150 int head[maxn],tot; int dp[maxn][maxn]; int Size[maxn],n,m; struct node { int to,v,val; } edge[maxn*maxn*10]; void add(int u,int v,int w) { edge[++tot].v=v; edge[tot].to=head[u]; edge[tot].val=w; head[u]=tot; edge[++tot].v=u; edge[tot].to=head[v]; edge[tot].val=w; head[v]=tot; } void dfs(int u,int pre) { Size[u]=1; for(int i=head[u]; i!=-1; i=edge[i].to) { int v=edge[i].v; if(v==pre)continue; dfs(v,u); Size[u]+=Size[v]; for(int j=Size[u]; j>1; j--) for(int k=1; k<j; k++) dp[u][j]=max(dp[u][j],dp[v][k]+dp[u][j-k]+edge[i].val); } } int main() { while(~scanf("%d%d",&n,&m)) { tot=0; memset(dp,0,sizeof(dp)); memset(head,-1,sizeof(head)); for(int i=1; i<n; i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); } dfs(1,-1); printf("%d\n",dp[1][m+1]); } return 0; }
B - Binary Apple Tree URAL - 树形DP+背包
最新推荐文章于 2021-02-08 21:25:57 发布