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 }
                    
                
                
            
        
浙公网安备 33010602011771号