题目HDU 1011
先把代码贴在这里,具体步骤后面再写
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
using namespace std;
int a[105],p[105];
int vis[105];
int dp[105][105];
int N,M;
struct Edge
{
int from,to;
};
vector<Edge>edg;
void dfs(int s)//以点s为根节点
{
vis[s]=1;
int cost=(a[s]+19)/20;//printf("Yes");
for(int i=cost;i<=M;i++)dp[s][i]=p[s];
for(int u=0;u<edg.size();u++)
{
if(edg[u].from==s)
{
int v=edg[u].to;
if(vis[v])continue;
dfs(v);
for(int i=M;i>=cost;i--)
for(int j=1;j<=i-cost;j++)
dp[s][i]=max(dp[s][i],dp[s][i-j]+dp[v][j]);
}
}
}
int main()
{
int n,k;
while(scanf("%d%d",&N,&M)!=EOF&&(N!=-1||M!=-1))
{
edg.clear();
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
for(int i=1;i<=N;i++)
scanf("%d%d",&a[i],&p[i]);
int k=1;
for(int i=0;i<N-1;i++)
{
int x,y;
Edge e1,e2;
scanf("%d%d",&x,&y);
e1.from=x;e1.to=y;
edg.push_back(e1);
e2.from=y;e2.to=x;
edg.push_back(e2);
}
dfs(1);
if(M==0)printf("0\n");
else printf("%d\n",dp[1][M]);
}
return 0;
}