bzoj4753
bzoj4753 树形dp+01分数规划
这是一个典型的树形背包+01分数规划。看见分数形式最大就应该想到01分数规划。
于是套用分数规划,每次用树形背包检验。
首先这是一棵树,不是一个森林,所以我们不用添加虚点。然后可以列出dp方程,具体代码。
然后每个点如果自己选了,那么父亲也要选,所以更新的时候,除了jyy也就是0号节点,都是从dp[u][1]开始更新,而且初值就是dp[u][0]=0,dp[u][1]=val,因为儿子选了,自己肯定会选,所以不能出现
dp[u][i]=dp[u][0]+dp[v][i]这种情况。
每次背包要从大到小枚举,常见技巧。
然后判断即是dp[0][k]>=0。
但是又有一个问题:val[0]是什么?如果是0的话,那么不就无法判断了?
那么我们这么设置一下,当u=0时,j可以枚举到0,因为jyy不算在k里,所以jyy就可以出现dp[0][i]=dp[0][0]+dp[v][i]的情况。但是val[0]还是设置成-inf,这样才可以取到最大值,否则一上来dp[0][1]就是0了。
#include<bits/stdc++.h>
using namespace std;
const int N = ;
const double inf = 1e9, eps = 1e-;
int n, k;
int r[N], size[N];
double ans;
double dp[N][N], s[N], p[N], val[N];
vector<int> G[N];
void dfs(int u)
{
dp[u][] = ;
dp[u][] = val[u];
++size[u];
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
dfs(v);
for(int j = min(size[u], k); j >= (u == ? : ); --j)
for(int l = min(size[v], k); l >= ; --l) if(j + l <= k)
{
// printf("dp[%d][%d]=%.10f dp[%d][%d]=%.10f dp[%d][%d]=%.10f\n", u, l + j, dp[u][l + j], u, j, dp[u][j], v, l, dp[v][l]);
dp[u][l + j] = max(dp[u][l + j], dp[u][j] + dp[v][l]);
}
size[u] += size[v];
} }
bool C(double x)
{
for(int i = ; i <= n; ++i)
{
size[i] = ;
val[i] = p[i] - s[i] * x;
for(int j = ; j <= k; ++j) dp[i][j] = -inf;
}
dfs();
return dp[][k] >= ;
}
int main()
{
scanf("%d%d", &k, &n);
s[] = inf;
for(int i = ; i <= n; ++i)
{
scanf("%lf%lf%d", &s[i], &p[i], &r[i]);
G[r[i]].push_back(i);
}
double l = , r = 1e4 + , mid;
while(r - l > eps)
{
mid = (l + r) / 2.0;
if(C(mid)) l = ans = mid;
else r = mid;
}
printf("%.3f\n", ans);
return ;
}
bzoj4753的更多相关文章
- 【BZOJ4753】最佳团体(分数规划,动态规划)
[BZOJ4753]最佳团体(分数规划,动态规划) 题面 BZOJ Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一 ...
- BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)
看到比值先二分答案.于是转化成一个非常裸的树形背包.直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对.这里使用一种更通用的dfs序优化树形背包写法.https://www.cnb ...
- BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)
BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包) 标签:题解 阅读体验 BZOJ题目链接 洛谷题目链接 具体实现 看到分数和最值,考虑分数规划 我们要求的是一个\(\dfrac{ ...
- [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序
分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...
- bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)
菜菜推荐的“水题”虐了我一天T T...(菜菜好强强qwq~ 显然是个分数规划题,二分答案算出p[i]-mid*s[i]之后在树上跑依赖背包,选k个最大值如果>0说明还有更优解. 第一次接触树形 ...
- bzoj4753 最佳团体
题目描述 JSOI 信息学代表队一共有 NN 名候选人,这些候选人从 11 到 NN 编号.方便起见,JYY 的编号是 00 号.每个候选人都由一位编号比他小的候选人R_iRi 推荐.如果 R_i ...
- bzoj4753[JSOI2016]最佳团体
题意:01分数规划,但可选的数字之间存在森林形的依赖关系(可以认为0号点是个虚根,因为并不能选). 虽然有森林形的依赖关系,但还是可以套分数规划的思路,二分答案k,判断是否存在一个比值大于k的方案 即 ...
- BZOJ4753:[JSOI2016]最佳团体——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4753 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. ...
- Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...
随机推荐
- 17Oracle Database 维护
Oracle Database 维护 备份 还原
- The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jdk1.8.0_60\bin;C:\Windows\Sun\Jav
启动项目自动结束,查看日志发现 [ost-startStop-1] o.a.catalina.core.AprLifecycleListener : The APR based Apache To ...
- Gym - 101670J Punching Power(CTU Open Contest 2017 最大独立集)
题目: The park management finally decided to install some popular boxing machines at various strategic ...
- Re0:DP学习之路 Proud Merchants HDU - 3466
解法 排序+01背包 这里的排序规则用q-p升序排列这里是一个感觉是一个贪心的策略,为什么这样做目前也无法有效的证明或者说出来 然后就是01背包加了一个体积必须大于什么值可以装那么加一个max(p,q ...
- Python爬虫入门教程: 27270图片爬取
今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥建议可以在评论的 ...
- gnulpot
gnulpot Table of Contents 1. Label position 2. coordinates 3. Symbols 4. key 4.1. key position 4.2. ...
- 洛谷 2213 [USACO14MAR]懒惰的牛The Lazy Cow_Sliver
[题解] 每个格子可以到达的区域是一个菱形,但是我们并不能快速的求和,所以我们可以把原来的草地旋转45度,用二维前缀和快速处理菱形的区域的和. #include<cstdio> #incl ...
- hdu 1166敌兵布阵(线段树入门题)
>>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...
- 威纶通 与 信捷XC\XD系列PLC 通讯
第一次使用信捷XD系列PLC正式做个项目,用的触摸屏为威纶通的 MT6071iP (注意:下面内容同样适用于 信捷XC系列PLC ,除信捷XC与XD系列编程软件不一样,其余接线设置实测均一样 ) 目前 ...
- poj 2823单调队列模板题
#include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃 #define N 1100000 int getmin[N],getmax[N],num[N],n,k, ...