//poj 1155
//sep9
#include <iostream>
#include <vector>
using namespace std;
const int MAXN=3012;
int n,m,ans;
struct Node
{
int v,w;
};
vector<Node> g[MAXN];
int num[MAXN],dp[MAXN][MAXN];
void dfs(int u)
{
for(int i=g[u].size()-1;i>=0;--i){
int v=g[u][i].v;
dfs(v);
for(int j=num[u];j>=0;--j)
for(int k=1;k<=num[v];++k)
dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[v][k]-g[u][i].w);
num[u]+=num[v];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n-m;++i){
int k;
num[i]=0;
scanf("%d",&k);
while(k--){
int v,w;
scanf("%d%d",&v,&w);
Node t;
t.v=v,t.w=w;
g[i].push_back(t);
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
dp[i][j]=INT_MIN;
for(int i=n-m+1;i<=n;++i){
num[i]=1;
scanf("%d",&dp[i][1]);
}
dfs(1);
for(int i=m;;--i)
if(dp[1][i]>=0){
printf("%d",i);
break;
}
return 0;
}
poj 1155 TELE 树形dp泛化背包
最新推荐文章于 2019-07-23 10:57:19 发布