P2015 二叉苹果树 ###K //K

题目链接:https://www.luogu.com.cn/problem/P2015

思路:树上背包问题  dp[i][j]为 以i为根 留j根树枝的最大值, 转移的时候枚举当前拿多少根树枝 以及子树拿多少根树枝即可

i过大的状态也不需要管 因为不会用到 没有影响

注意的是  当前的结点连着子树结点的这条边是一定要拿的,所以是=dp[u][i-j-1]+dp[v][j]+val[u][v]

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e2+10;
 4 const int mod=998244353;
 5 #define ll long long
 6 #define pb push_back
 7 #define pi pair<int,int>
 8 #define fi first
 9 #define sc second
10 
11 int n,V;
12 int dp[maxn][maxn];
13 vector<pi>E[maxn];
14 
15 void dfs(int u,int fa)
16 {
17     for(auto &v:E[u])
18     {
19         if(v.fi==fa)
20             continue;
21         dfs(v.fi,u);
22         for(int j=V;j>=0;j--)
23             for(int k=0;k<=j-1;k++)
24                 dp[u][j]=max(dp[u][j],dp[v.fi][k]+dp[u][j-k-1]+v.sc);
25 
26     }
27 
28 }
29 
30 
31 int main()
32 {
33     ios::sync_with_stdio(0);
34     cin.tie(0);
35     cin>>n>>V;
36     for(int i=1;i<n;i++)
37     {
38         int x,y,z;
39         cin>>x>>y>>z;
40         E[x].pb({y,z});
41         E[y].pb({x,z});
42     }
43     dfs(1,0);
44     cout<<dp[1][V]<<'\n';
45 
46 
47 
48 
49 }
View Code

 

posted @ 2020-11-25 00:13  canwinfor  阅读(138)  评论(0)    收藏  举报