给你一棵树,欲取子节点,必取父节点。问取的价值最多为多少。
简单树形背包,直接贴代码。
#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
#define Maxn 300
vector<int> e[Maxn];
int A[Maxn],B[Maxn];
int dp[Maxn][Maxn],vis[Maxn];
int ans;
int n,m,cur[Maxn];
void dfs(int u)
{
int i,j,k;
vis[u]=1;
dp[u][1]=B[u];
for(i=0;i<e[u].size();i++){
int v=e[u][i];
if(vis[v]) continue;
dfs(v);
// cout<<u<<" "<<v<<endl;
for(j=m+1;j>0;j--){
for(k=1;k<j;k++)
dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)){
if(!n&&!m) break;
int tt=0;
for(i=0;i<Maxn;i++)
e[i].clear();
for(i=1;i<=n;i++){
scanf("%d%d",&A[i],&B[i]);
e[A[i]].push_back(i);
}
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
B[0]=0;
dfs(0);
printf("%d\n",dp[0][m+1]);
}
return 0;
}