洛谷 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]); } } }
本文深入解析洛谷P2014选课问题,采用树形依赖背包算法解决课程选择的最优路径问题。通过递归深度优先搜索遍历所有可能的课程组合,动态规划记录每一步的最大价值,最终输出满足条件的最大价值。

被折叠的 条评论
为什么被折叠?



