POJ 1947
#include<iostream>
#include<vector>
#define inf 0x007fffff
using namespace std;
int f[151][151];
vector<int>Tree[151];
int n,p;
void DFS(int root)
{
int i,j,k;
for(i=0;i<Tree[root].size();i++)
{
DFS(Tree[root][i]);
}
f[root][1]=Tree[root].size();
for (i=0;i<Tree[root].size();i++)
for(k=p-1;k>=1;k--)
if (f[root][k]<inf)
{
for (j=1;j<=p-1;j++)
if (f[Tree[root][i]][j]<inf)
f[root][k+j]=min(f[root][k]+f[Tree[root][i]][j]-1,f[root][k+j]);
}
return ;
}
int DP()
{
int i,j;
for(i=1;i<= n; i++)
for (j=0;j<=n;j++)
f[i][j]=inf;
DFS(1);
int res=inf;
for(i=2;i<=n;i++)
res=min(res,f[i][p]+1);
res=min(res,f[1][p]);
return res;
}
int main()
{
scanf("%d%d",&n,&p);
int i,j,a,b;
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
Tree[a].push_back(b);
}
printf("%d\n",DP());
system("pause");
return 0;
}
f[i][j]代表以i为根(包含i),共j个节点需要切断的路的数量
f[i][j+k]=min(f[i][j+k],f[i.son[t]][k])(t为i的孩子)