1. 程式人生 > >[JZOJ5344]【NOIP2017模擬9.3A組】摘果子

[JZOJ5344]【NOIP2017模擬9.3A組】摘果子

Description

這裡寫圖片描述
這裡寫圖片描述

Solution

樹形依賴揹包裸模型

F[i][j]表示表示DFS序上第i~N個已經做完了,重量為j
F[i][j]=max(F[i+1][jweight[d[i]]]+value[d[i]],F[i+size[d[i]]][j])

Code

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) #define N 2005 using namespace std; int fs[N],dt[2*N],nt[2*N],f[N][N],n,m,m1,vl[N],pr[N],dfn[N],n1,sz[N]; void link(int x,int y) { nt[++m1]=fs[x]; dt[fs[x]=m1]=y; } void dfs(int k,int fa) { dfn[++n1]=k;
sz[k]=1; for(int i=fs[k];i;i=nt[i]) { int p=dt[i]; if(p!=fa) dfs(p,k),sz[k]+=sz[p]; } } int main() { cin>>n>>m; fo(i,1,n) scanf("%d%d",&vl[i],&pr[i]); fo(i,1,n-1) { int x,y; scanf("%d%d",&x,&y); link(x,y),link(y,x);
} dfs(1,0); fod(i,n,1) { fod(j,m,0) { f[i][j]=f[i+sz[dfn[i]]][j]; if(j>=pr[dfn[i]]) f[i][j]=max(f[i][j],f[i+1][j-pr[dfn[i]]]+vl[dfn[i]]); } } int ans=0; fo(i,0,m) ans=max(ans,f[1][i]); printf("%d\n",ans); }