#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
struct Node
{
int a,b;
};
Node edge[210];
vector<int> nextpoint[105];
int dp[105][105];
int n,m;
inline int maxx(int a,int b)
{
return a>b?a:b;
}
void init()
{
memset(dp,0,sizeof(dp));
for(int i=0;i<105;i++)
nextpoint[i].clear();
}
void searchs(int a,int c)
{
int rema = edge[a].a;
int remain = rema / 20;
if(rema%20) remain++;
for(int i=remain;i<=m;i++) dp[a][i] = edge[a].b;
for(int i=0;i<nextpoint[a].size();i++)
{
int d = nextpoint[a][i];
if(d==c) continue;
searchs(d,a);
for(int j=m;j>=remain;j--)
for(int k=1;k+j<=m;k++)
if(dp[d][k])
dp[a][j+k] = max(dp[a][j+k],dp[d][k]+dp[a][j]);
}
}
int main()
{
while(scanf("%d%d",&n,&m) != EOF)
{
if(n==-1&&m==-1)break;
init();
for(int i=1;i<=n;i++)
scanf("%d%d",&edge[i].a,&edge[i].b);
for(int i=0;i<n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
nextpoint[x].push_back(y);
nextpoint[y].push_back(x);
}
searchs(1,-1);
int maxs=0;
//for(int i=0;i<=m;i++)if(dp[1][i]>maxs) maxs = dp[1][i];
if(m!=0)printf("%d\n",dp[1][m]);
else puts("0");
}
return 0;
}
hdu 1011 树dp还是容易理解的,不过在做这个题的时候把一个边界条件给忽略了,以后得注意
最新推荐文章于 2021-06-18 16:15:17 发布