HDU 5534 Partial Tree(完全背包)

来源:互联网 发布:c语言数据类型怎么用 编辑:程序博客网 时间:2024/05/29 18:19

题目链接
题意:给你n个点构成一棵树,告诉每个度的权重,现在怎么构建一棵树,使他的权重最大。
解法:n个点,度数和是2*(n-1),然后没个点的度数至少是1,先把每个点分配一度,然后剩下的n-2度分配出去,使得权重最大,这个过程可以用完全背包(恰好装满)。n个点,体积是i+1(因为之前分配了1度,i为此次分配的度数),价值是度数对应权重,背包容量是n-2,dp[i]:表示分配了i点的最大值,也可以理解是背包装了i体积的最大值

//#define CF#ifndef CF#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<string>#include<iostream>#include<set>#include<vector>#else#include<bits/stdc++.h>#endif // CFusing namespace std;#define LL long long#define pb push_back#define X first#define Y second#define cl(a,b) memset(a,b,sizeof(a))typedef pair<long long ,long long > P;const int maxn=100005;const LL inf=1LL<<60;const LL mod=1e9+7;LL a[maxn];LL dp[maxn];int main(){    int T;scanf("%d",&T);    while(T--){        int n;scanf("%d",&n);        for(int i=1;i<n;i++){            scanf("%lld",&a[i]);        }        fill(dp,dp+maxn,-inf);        dp[0]=n*a[1];        n-=2;        for(int i=1;i<=n;i++){            for(int j=i;j<=n;j++){                dp[j]=max(dp[j],dp[j-i]+a[1+i]-a[1]);            }        }        printf("%lld\n",dp[n]);    }    return 0;}
0 0