HDU 1011 Starship Troopers

View Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
vector<int>list[124];
int value[124],num[124];
int dp[124][124];
int hash[124];
void DFS( int f ,int M )
{
int len = list[f].size();
int t=0;
t = (num[f]+19)/20;
for( int i = t ; i<= M ; i++ )
dp[f][i] = value[f];
hash[f] = 1;
for( int i = 0 ; i < len ; i ++ )
{
if( hash[list[f][i]] )
{
continue;
}
DFS( list[f][i] , M );
for( int j = M ; j >= t ; j-- )
{
for( int k = 1 ; k<=M ; k++ )
{
if((j-k)>=t)
if( dp[f][j] < dp[f][j-k] + dp[list[f][i]][k] )
dp[f][j] = dp[f][j-k] + dp[list[f][i]][k];
}
}

}
}
int main( )
{
int n , m ,a,b;
while( scanf( "%d%d",&n ,&m ),m!=-1||n!=-1 )
{
memset( dp , 0 ,sizeof( dp ) );
memset( hash , 0 ,sizeof( hash ) );
for( int i = 1; i <= n ; i++ )
{
list[i].clear();
scanf( "%d%d",&num[i],&value[i] );
}
for( int i = 1; i < n ; i++ )
{
scanf( "%d%d",&a ,&b );
list[a].push_back( b );
list[b].push_back( a );
}
if( m ==0 )printf( "0\n" );
else
{
DFS( 1 , m );
printf( "%d\n",dp[1][m] );
}
}
return 0;
}


这是一道树形DP;树形DP在http://acm.hdu.edu.cn/showproblem.php?pid=1561讲过了,这里就不累叙了;

http://www.cnblogs.com/bo-tao/这里可以看到解法;

 

posted @ 2012-03-07 14:57  wutaoKeen  阅读(145)  评论(0编辑  收藏  举报