洛谷p1272
题意:给出一棵含有n个结点的树,求最少删除几条边可以得到一个大小为p的子树
题解:树形dp。dp[u][siz]为得到一个以u为根结点大小为siz的树最少需要删除的边数,那么最后结果就是dp[u][p]的最小值+(u是否等于整棵树的根,如果不是则需要+1用于砍掉与根的联系,否则不需要+1)
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<" is "<<x<<endl;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=155;
const int maxn2=2e4+5;
const ll inf=1e15;
int cnt,head[maxn],siz[maxn],dp[maxn][maxn],out[maxn];
struct edge{
int fr;
int to;
int nex;
}e[maxn<<1];
void adde(int x,int y){
e[cnt].fr=x;
e[cnt].to=y;
e[cnt].nex=head[x];
head[x]=cnt++;
}
void dfs(int u,int f){
siz[u]=1;
for(int i=head[u];i!=-1;i=e[i].nex){
int v=e[i].to;
if(v==f)continue;
dfs(v,u);
siz[u]+=siz[v];
}
dp[u][siz[u]]=0;
}
void dfs2(int u,int f