標籤:tar min get int val pre targe https problem
題目描述
有一棵蘋果樹,如果樹枝有分叉,一定是分2叉(就是說沒有只有1個兒子的結點)
這棵樹共有N個結點(葉子點或者樹枝分叉點),編號為1-N,樹根編號一定是1。
我們用一根樹枝兩端串連的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹
2 5 \ / 3 4 \ / 1 現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果。
給定需要保留的樹枝數量,求出最多能留住多少蘋果。
輸入輸出格式輸入格式:
第1行2個數,N和Q(1<=Q<= N,1<N<=100)。
N表示樹的結點數,Q表示要保留的樹枝數量。接下來N-1行描述樹枝的資訊。
每行3個整數,前兩個是它串連的結點的編號。第3個數是這根樹枝上蘋果的數量。
每根樹枝上的蘋果不超過30000個。
輸出格式:
一個數,最多能留住的蘋果的數量。
輸入輸出範例輸入範例#1:
5 21 3 11 4 102 3 203 5 20
輸出範例#1:
21
寫法和洛穀2014是一樣的 不過是根是1而已 屠龍寶刀點擊就送
#include <cstdio>#include <vector>#define N 205using namespace std;vector<pair<int,int> >G[N];inline int max(int a,int b) {return a>b?a:b;}inline int min(int a,int b) {return a>b?b:a;}int x,y,z,n,q,f[N][N];int dfs(int now,int pre){ int num=0; for(int i=0;i<G[now].size();++i) { int v=G[now][i].first,val=G[now][i].second; if(v==pre) continue; num+=dfs(v,now)+1; for(int j=min(num,q);j>=1;--j) for(int k=j-1;k>=0;--k) f[now][j]=max(f[now][j],f[now][j-k-1]+f[v][k]+val); } return num;}int main(){ scanf("%d%d",&n,&q); for(int i=1;i<n;++i) { scanf("%d%d%d",&x,&y,&z); G[x].push_back(make_pair(y,z)); G[y].push_back(make_pair(x,z)); } dfs(1,0); printf("%d\n",f[1][q]); return 0;}
洛穀 P2015 二叉蘋果樹