树型背包
作者:互联网
简单来说就是背包问题与树形 DP 的结合
让我们来看个例题
https://www.luogu.com.cn/problem/P2014
这道题的思路如图:
ac代码如下:
#define NMAX 303
int dp[NMAX][NMAX];//1维->节点编号 2维选了多少门课
//dp[u][i][xx] = max(dp[u][i][xx],dp[u][i-1][x1]+dp[v][i-1][x2]) x1+x2=xx
int s[NMAX];
vector<int> childs[NMAX];
void dfs(int u,int m){
dp[u][1] = s[u];
int childsCnt = childs[u].size();
for(int i=0;i<childsCnt;++i){
int v = childs[u][i];
dfs(v,m);
for(int j=m+1;j>0;j--){
for(int k=1;k<j;k++){
dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]);
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int N,M;
int k;
cin >> N >> M;
for(int i=1;i<=N;++i){
cin >> k >> s[i];
childs[k].push_back(i);
}
dfs(0,M);
cout << dp[0][M+1] << endl;
return 0;
}
标签:NMAX,背包,int,dfs,xx,childs,树型,dp 来源: https://www.cnblogs.com/kingbuffalo/p/16358888.html