The more, The Better
阿新 • • 發佈:2019-02-04
給你一棵樹,欲取子節點,必取父節點。問取的價值最多為多少。
簡單樹形揹包,直接貼程式碼。
#include<iostream> #include<vector> #include<stdio.h> using namespace std; #define Maxn 300 vector<int> e[Maxn]; int A[Maxn],B[Maxn]; int dp[Maxn][Maxn],vis[Maxn]; int ans; int n,m,cur[Maxn]; void dfs(int u) { int i,j,k; vis[u]=1; dp[u][1]=B[u]; for(i=0;i<e[u].size();i++){ int v=e[u][i]; if(vis[v]) continue; dfs(v); // cout<<u<<" "<<v<<endl; for(j=m+1;j>0;j--){ for(k=1;k<j;k++) dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); } } } int main() { int i,j; while(scanf("%d%d",&n,&m)){ if(!n&&!m) break; int tt=0; for(i=0;i<Maxn;i++) e[i].clear(); for(i=1;i<=n;i++){ scanf("%d%d",&A[i],&B[i]); e[A[i]].push_back(i); } memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); B[0]=0; dfs(0); printf("%d\n",dp[0][m+1]); } return 0; }