HDU 5534 Partial Tree(完全背包)
2015-12-01 13:49
218 查看
题目链接
题意:给你n个点构成一棵树,告诉每个度的权重,现在怎么构建一棵树,使他的权重最大。
解法:n个点,度数和是2*(n-1),然后没个点的度数至少是1,先把每个点分配一度,然后剩下的n-2度分配出去,使得权重最大,这个过程可以用完全背包(恰好装满)。n个点,体积是i+1(因为之前分配了1度,i为此次分配的度数),价值是度数对应权重,背包容量是n-2,dp[i]:表示分配了i点的最大值,也可以理解是背包装了i体积的最大值
题意:给你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 // CF using 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 ); } return 0; }
相关文章推荐
- VoLTE……由来
- asp.net web api 的版本升级到 2.2的记录
- 线程、异步
- 常用编码的发展史
- Mean Average Precision
- Linux NTP配置详解 (Network Time Protocol)
- 解决 “Could not find class 'com.goole.zxing.Result”和“Multiple dex files define”问题
- 性能测试-性能测试工具工作原理
- ListView的基础应用
- 栈的顺序存储实现
- Java继承中的"陷阱"问题
- Mac上Apache与PHP的配置
- 分页存储过程
- android 资源读取
- hadoop 2.6配置记录
- hadoop 2.6配置记录
- Eclipse-----切换SVN账号
- Spring使用Cache
- Android Activity的生命周期
- mysql 查看 索引