标签:dp
把0作为根,然后dp
注意一点 就是以前是选取m个点 现在相当于选取了m+1个点
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int dp[222][222];
vector<int>mp[222];
int val[222];
int vis[222];
int n,m;
void dfs(int u){
vis[u]=1;
dp[u][1]=val[u];
for(int i=0;i<mp[u].size();i++){
int v = mp[u][i];
if(vis[v]) continue;
dfs(v);
for(int j=m+1;j>1;j--){
for(int k=1;k<j;k++){
dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m)==2){
if(n==0&&m==0) break;
for(int i=0;i<=n;i++){
mp[i].clear();
}
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
mp[a].push_back(i);
val[i]=b;
}
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
vis[0]=1;
dfs(0);
printf("%d\n",dp[0][m+1]);
}
}
标签:dp
原文地址:http://blog.csdn.net/u013076044/article/details/46046261