http://acm.hdu.edu.cn/showproblem.php?pid=1011
#include<iostream>
using namespace std;
#define N 101
int w[N],val[N];
int dp[N][N];
int n,m;
struct node{
int next,v;
node(){};
node(int a,int b){
next=a;v=b;
}
}E[2*N];
int head[N],NE;
bool h[N];
void init(){
NE=0;
memset(head,-1,sizeof(head));
memset(dp,0,sizeof(dp));
memset(h,0,sizeof(h));
}
void insert(int u,int v){
E[NE]=node(head[u],v);
head[u]=NE++;
}
void dfs(int u){
for(int i=w[u];i<=m;i++)
dp[u][i]=val[u];
for(int i=head[u];i!=-1;i=E[i].next){
int v=E[i].v;
if(!h[v]){
h[v]=1;
dfs(v);
for(int j=m;j>=w[u];j--)
for(int k=1;k+j<=m;k++){
if(dp[v][k])
dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[v][k]);
}
}
}
}
int main(void){
while(scanf("%d%d",&n,&m),n!=-1&&m!=-1){
init();
for(int i=1;i<=n;i++){
scanf("%d%d",&w[i],&val[i]);
if(w[i]%20==0)
w[i]/=20;
else{
w[i]/=20;
w[i]++;
}
}
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
insert(u,v);
insert(v,u);
}
if(m==0){
printf("0\n");
continue;
}
h[1]=1;
dfs(1);
printf("%d\n",dp[1][m]);
}
}