POJ1561-The more, The Better
http://acm.hdu.edu.cn/showproblem.php?pid=1561
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,num[250],map[250][250],dp[250][250],vis[250]; void dfs(int p) { int i,j,k,t; vis[p]=1; for(i=1;i<=num[p];i++) { t=map[p][i]; if(!vis[t]) dfs(t); for(j=m;j>=2;j--) for(k=1;k<j;k++) if(dp[t][j-k]!=-1&&dp[p][k]!=-1) dp[p][j]=max(dp[p][j],dp[p][k]+dp[t][j-k]); } } int main(void) { int i,j,a,b; while(scanf("%d%d",&n,&m),n||m) { dp[0][1]=0; memset(num,0,sizeof(num)); memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); dp[i][1]=b; map[a][++num[a]]=i; } m++; for(i=0;i<=n;i++) { dp[i][0]=0;vis[i]=0; for(j=2;j<=m;j++) dp[i][j]=-1; } dfs(0); printf("%d\n",dp[0][m]); } return 0; }