二刷提高课,题解目录在这里— 提高课的题解目录
此题有两点需要注意:
1.如果不选父节点向上的树枝,则下面的树枝均不选
2.所选的树枝数量是有限的
则这不就是我们所做过的有依赖背包问题吗(将树枝数量看做体积)
#include<iostream>
#include<cstring>
using namespace std;
const int N=110,M=2*N;
int h[N],de[M],we[M],ne[M];
int n,dix,m;
int f[N][N];
void add(int a,int b,int c)
{
de[dix]=b,ne[dix]=h[a],h[a]=dix,we[dix++]=c;
}
void dfs(int u,int fa)
{
for(int i=h[u];~i;i=ne[i])
{
int j=de[i];
if(j==fa)continue;
dfs(j,u);
//分组背包——循环体积
for(int k=m;k>=0;k--)
for(int v=0;v<k;v++)
f[u][k]=max(f[u][k],f[u][k-v-1]+f[j][v]+we[i]);
}
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=1;i<n;i++)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
dfs(1,-1);
cout<<f[1][m];
return 0;
}