您的位置:首页 > 其它

hdu 1011(树形dp)

2014-05-02 16:15 232 查看
Mark。看着吴神博客写的,还未完全懂。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define MP(a, b) make_pair(a, b)
#define PB(a) push_back(a)
using namespace std;

const int LEN = 2010;
int W[LEN], V[LEN], n, m, dp[LEN][LEN];
vector<int> Map[LEN];

void dfs(int v, int fa){
for(int i=0; i<Map[v].size(); i++){
int x = Map[v][i];
if(x != fa){
dfs(x, v);
for(int k=m; k>=V[v]; k--){
for(int j=1; j<=m; j++){
if(k>=j+V[v])dp[v][k] = max(dp[v][k], dp[v][k-j] + dp[x][j]);
}
}
}
}
for(int i=V[v]; i<=m; i++) dp[v][i] += W[v];
}

int main()
{
//    freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);

int a, b;
while(cin >> n >> m){
if(n < 0 && m < 0) break;
for(int i=0; i<LEN; i++) Map[i].clear();
memset(dp, 0, sizeof dp);
for(int i=0; i<n; i++){
cin >> V[i] >> W[i];
V[i] = (V[i]+19)/20;
}
for(int i=0; i<n-1; i++){
cin >> a >> b;
a--, b--;
Map[a].PB(b);
Map[b].PB(a);
}
dfs(0, -1);
if(!m) cout << 0 << endl;
else cout << dp[0][m] << endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: