52分求助dalao(悬赏关注)
查看原帖
52分求助dalao(悬赏关注)
748700
IkunTeddy楼主2023/8/5 16:39

调了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;
}


2023/8/5 16:39
加载中...