Skip to content

树形背包 ​

cpp
void dfs(int u,int fa){
	siz[u]=1;
	f[u][0]=f[u][1]=0;
	if(adj[u].size()==1&&u!=1)return;
	for(auto [v,w]:adj[u]){
		if(v==fa)continue;
		dfs(v,u);
		for(int j=min(m,siz[u]);j>=0;j--){
			for(int k=min(m-j,siz[v]);k>=0;k--){
				int val=w*((m-k)*k+(siz[v]-k)*(n-m-siz[v]+k));
				f[u][j+k]=max(f[u][j+k],f[u][j]+f[v][k]+val);
			}
		}
		siz[u]+=siz[v];
	}
}