OJ题目:点这里~
欲取该节点,需先取得父节点。取m个节点,能得到的最大值。
AC_CODE
#define Max_N 1008
int N , M ;
vector<int> List[Max_N];
int dp[Max_N][Max_N];
void dfs(int u)
{
int i, j, v ,k;
for(i = 0;i < List[u].size();i++)
{
v = List[u][i];
dfs(v);
for(j = M;j >= 2;j--)
for(k = 1;k < j;k++)
dp[u][j] = Max(dp[u][j] , dp[u][k] + dp[v][j - k]);
}
}
int main()
{
while(scanf("%d%d",&N ,&M)&&N||M)
{
int i ,v, w ,u;
memset(dp , 0 , sizeof(dp));
for(i = 0;i <= N;i++) List[i].clear();
for(v = 1;v <= N;v++)
{
scanf("%d%d",&u ,&w);
List[u].push_back(v);
dp[v][1] = w;
}
M++;
dfs(0);
printf("%d\n" , dp[0][M]);
}
return 0;
}