调了1一个小时了,求助!!!
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn=2000+10;
int n,x;
vector<int> vt[maxn];
int a[maxn];
int dp[maxn][maxn];
int size[maxn];
int f[maxn];
void dfs(int u,int fa){
int l=vt[u].size();
for(int i=0;i<n;i++) dp[u][i]=x-a[u];
size[u]=1;
for(int i=0;i<l;i++){
int v=vt[u][i];
if(v==fa) continue;
dfs(v,u);
size[u]+=size[v];
memset(f,-0x3f,sizeof(f));
for(int j=size[u]-1;j>=0;j--){
for(int k=size[v]-1;k>=0;k--){
if(j-k-1>=0) f[j]=max(f[j],dp[v][k]+dp[u][j-k-1]);
if(dp[v][k]>=0&&j-k>=0) f[j]=max(f[j],dp[u][j-k]);
}
}
for(int j=size[u]-1;j>=0;j--) dp[u][j]=f[j];
}
}
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
vt[a].push_back(b);
vt[b].push_back(a);
}
memset(dp,-0x3f,sizeof(dp));
dfs(1,0);
int ans=0x3f3f3f3f;
for(int i=0;i<n;i++){
if(dp[1][i]>=0){
cout<<i;
return 0;
}
}
return 0;
}