dp[ i ] [ j ] 以节点i为跟,取j个(包括i,即dp[i][1]=V[i])所能得到的最大值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int N,M,v[223];
vector<int>son[223];
int dp[223][223];
void dfs(int n,int left){
int i,j,k,len=son[n].size();
dp[n][1]=v[n];
for(i=0;i<len;i++){
if(left>1) dfs(son[n][i],left-1);
for(j=left;j>=1;j--)
for(k=1;k<=j;k++)
if(dp[n][j+1]< dp[n][j+1-k] +dp[son[n][i]][k]) dp[n][j+1]=dp[n][j+1-k]+dp[son[n][i]][k];
// 其他儿子的总值 第i个儿子取k个
}
}
int main()
{
int i,j,k;
while(scanf("%d%d",&N,&M),N||M)
{
//
memset(v,0,sizeof(v));
memset(dp,0,sizeof(dp));
for(i=0;i<=N;i++) son[i].clear();
//
for(i=1;i<=N;i++){
scanf("%d%d",&j,&v[i]);
son[j].push_back(i);
}
dfs(0,M+1);
printf("%d\n",dp[0][M+1]);
}
return 0;
}

本文详细解析了HDU1561题目“The More, The Better”的DP算法实现过程,通过递归深度优先搜索的方式求解以每个节点为根时选取不同节点数目的最大价值,并给出了完整的C++代码实现。
13万+

被折叠的 条评论
为什么被折叠?



