ZOJ 3201 Tree of Tree(树形dp + 分组背包)

来源:互联网 发布:零基础学算法百度云 编辑:程序博客网 时间:2024/05/16 14:59

OJ题目:click here ~~


AC_CODE

const int inf = 1<<30;int n , k;int x[102];int dp[102][102];vector < int > List[102];void dfs(int u , int father){    int i , j;    for(i = 0;i < List[u].size();i++)    {        int v = List[u][i];        if(v == father) continue;        dfs(v , u);        for(j = k;j >= 1;j--)//一定要倒序        {            for(int t = 1;t <= j;t++)                dp[u][j] = max(dp[u][j] , dp[u][t] + dp[v][j - t]);        }    }}int main(){    while(cin >> n >> k)    {        int i , j , a , b;        for(i = 0;i <= n;i++) List[i].clear();        memset(dp , 0 , sizeof(dp));        for(i = 0;i < n;i++)        {            scanf("%d",&dp[i][1]);        }        for(i = 0;i < n-1;i++)        {            scanf("%d%d",&a,&b);            List[a].push_back(b);            List[b].push_back(a);        }        dfs(0 , -1);        int ans = -1;        for(i = 0;i < n;i++)            ans = max(ans , dp[i][k]);        cout << ans << endl;    }    return 0;}


0 0