#include #define maxn 205 using namespace std; int n,m,dp[maxn][200001],U[maxn]; struct EDGE{int v,w;}; vectoredge[maxn]; namespace CZS_Office{ inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*f; } inline void write(int x){ if(x<0){ putchar('-'); x=-x; } if(x>9)write(x/10); putchar(x%10+'0'); return; } } using namespace CZS_Office; int siz[maxn]; inline void dfs(int rt,int fa){ for(EDGE E:edge[rt]){ int v=E.v,w=E.w; if(v==fa)continue; dfs(v,rt); siz[rt]+=siz[v]+w; for(int i=siz[rt];i>=w;--i){ dp[rt][i]=max(dp[rt][i],dp[v][i-w]+U[rt]); for(int j=i-w;j>=0;--j){ dp[rt][i]=max(dp[rt][i],dp[rt][j]+dp[v][i-w-j]); } } } dp[rt][0]=U[rt]; for(int i=1;i<=siz[rt];++i)dp[rt][i]=max(dp[rt][i],dp[rt][i-1]); return; } signed main(){ n=read();m=read();m/=2; for(int i=0;i