其实用点权更简单,但这种做法是边权的
/* 依赖背包问题 dp[u][k]表示u结点往下共走k步的最大值 */ #include<iostream> #include<cstring> #include<cstdio> using namespace std; struct Edge{int w,to,nxt;}edge[500]; int head[500],tot,n,k,dp[500][500]; void init(){ memset(head,-1,sizeof head); tot=0; } void addedge(int u,int v,int w){ edge[tot].w=w;edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++; } void dfs(int u,int pre){ for(int i=head[u];i!=-1;i=edge[i].nxt){ int v=edge[i].to; if(v!=pre)dfs(v,u); } for(int i=head[u];i!=-1;i=edge[i].nxt){ int v=edge[i].to; if(v==pre)continue; for(int j=k;j>=0;j--) for(int t=0;t<j;t++) dp[u][j]=max(dp[u][j],dp[u][t]+dp[v][j-t-1]+edge[i].w); } //printf("%d %d %d %d ",u,dp[u][0],dp[u][1],dp[u][k]); } int main(){ while(cin>>n>>k){ init(); for(int i=1;i<n;i++){ int u,v,w; cin>>u>>v>>w; addedge(u,v,w); addedge(v,u,w); } memset(dp,0,sizeof dp); dfs(1,0); printf("%d ",dp[1][k]); } return 0; }