dp[u][k] 表示 攻克第u个城堡,已攻克k个城堡获得的最大值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long lld;
#define REP(i,n) for(int i=0;i<(n);i++)
const int maxn = 205;
const int inf = 0x7f7f7f7f;
vector<pair<int ,int > >vv[maxn];
int dp[maxn][maxn];
int b[maxn];
void DP(int u,int m)
{
//dp[u][1]=max(dp[u][1],b[u]);
for(int i=0;i<vv[u].size();i++)
{
int v=vv[u][i].first;
DP(v,m-1);
for(int k=m;k>=1;k--)
{
for(int j=0;j<k;j++)
dp[u][k]=max(dp[u][k],dp[v][j]+dp[u][k-j-1]+vv[u][i].second);
}
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)&&(n||m))
{
for(int i=0;i<=n;i++) vv[i].clear();
for(int i=1;i<=n;i++)
{
int a;
scanf("%d%d",&a,&b[i]);
vv[a].push_back(make_pair(i,b[i]));
}
memset(dp,0,sizeof(dp));
DP(0,m);
printf("%d\n",dp[0][m]);
}
return 0;
}