树形DP
#include<iostream>
#include<cstring>
#include<vector>
#define maxn 105
using namespace std;
int c[maxn],d[maxn];
vector<int>mapp[maxn];
int dp[maxn][maxn];
int visit[maxn];
int n,m;
void input()
{
for(int i=1;i<=n;i++)
{
cin>>c[i]>>d[i];
}
for(int i=0;i<n-1;i++)
{
int x,y;
cin>>x>>y;
mapp[x].push_back(y);
mapp[y].push_back(x);
}
}
void solve(int cnt)
{
int num=(c[cnt]+19)/20;
for(int i=num;i<=m;i++) dp[cnt][i]=d[cnt];
visit[cnt]=1;
for(int i=0;i<mapp[cnt].size();i++)
{
int t=mapp[cnt][i];
if(visit[t]) continue;
solve(t);
for(int j=m;j>=num;j--)
{
for(int k=j-num;k>=1;k--)
{
dp[cnt][j]=max(dp[cnt][j],dp[cnt][j-k]+dp[t][k]);
}
}
}
}
int main()
{
while(cin>>n>>m)
{
if(n==-1||m==-1) break;
for(int i=0;i<=n;i++) mapp[i].clear();
memset(dp,0,sizeof(dp));
memset(visit,0,sizeof(visit));
input();
if(!m)
{
cout<<0<<endl;
continue;
}
solve(1);
cout<<dp[1][m]<<endl;
}
return 0;
}