题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561
3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0
5 13
#include <iostream> #include <cstdio> #include <vector> #include <cmath> #include <cstring> using namespace std; vector<int>V[210]; int val[210]; int dp[210][210]; int dfs(int node,int num) { int len=V[node].size(); dp[node][1]=val[node]; for (int i=0; i<len; i++) { if (num<=1) break; dfs(V[node][i],num-1); for (int j=num;j>=1; j--) { for (int k=1;k<=j;k++) { dp[node][j+1]=max(dp[node][j+1],dp[node][j+1-k]+dp[V[node][i]][k]); } } } } int main() { int n,m,a,b; while (~scanf("%d%d",&n,&m)) { memset(dp,0,sizeof(dp)); memset(val,0,sizeof(val)); if (n==0&&m==0) break; for (int i=0; i<=n; i++) V[i].clear(); for (int i=1; i<=n; i++) { scanf("%d%d",&a,&b); V[a].push_back(i); //fa[i]=a; val[i]=b; } dfs(0,m+1);//因为多加了一个零,所以要多攻克一个,故加一。 cout<<dp[0][m+1]<<endl; } return 0; }