洛谷 P2014 选课 树形依赖背包
import java.util.*; public class Main1{ static int MAXN=305; static int n,m,s[]=new int[MAXN],sz[]=new int[MAXN],dp[][]=new int[MAXN][MAXN]; static Vector<Integer>[]g=new Vector[MAXN]; public static void dfs(int u,int fa){ sz[u]=1;dp[u][1]=s[u]; for(int v:g[u]){ if(v==fa) continue; dfs(v,u); sz[u]+=sz[v]; for(int j=Math.min(m, sz[u]);j>=2;j--){ for(int k=1;k<=Math.min(j-1, sz[u]);j++){ dp[u][j]=Math.max(dp[u][j], dp[u][j-k]+dp[v][k]); } } } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n = sc.nextInt(); int m = sc.nextInt(); m++; for(int i=1;i<=n;i++){ int k =sc.nextInt(); s[i]=sc.nextInt(); g[k].add(i); g[i].add(k); } dfs(0,-1); System.out.println(dp[0][m]); } } }