这个题是树形DP,还不太会,参考了网上别人的代码做的
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
const int maxn=201;
int n,m,e,head[maxn],pnt[maxn],nxt[maxn],cost[maxn],dp[maxn][maxn],f[maxn][maxn];
bool vis[maxn];
void Addedge(int u,int v)
{
pnt[e]=v;nxt[e]=head[u];head[u]=e++;
}
void DFS(int u)
{
vis[u]=1;
for(int i=head[u];i!=-1;i=nxt[i])
{
int v=pnt[i];
if(!vis[v])
{
DFS(v);
for(int j=m;j>=0;j--)
for(int k=0;k<=j;k++)
f[u][j]=max(f[u][j],f[u][j-k]+dp[v][k]);
}
}
for(int i=1;i<=m+1;i++)
dp[u][i]=f[u][i-1]+cost[u];
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n+m))
{
e=0;
memset(head,-1,sizeof(head));
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
int u,c;
scanf("%d%d",&u,&c);
Addedge(u,i);
cost[i]=c;
}
DFS(0);
printf("%d\n",dp[0][m+1]);
}
return 0;
}