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的更多相关文章

  1. 【BZOJ4753】最佳团体(分数规划,动态规划)

    [BZOJ4753]最佳团体(分数规划,动态规划) 题面 BZOJ Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一 ...

  2. BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)

    看到比值先二分答案.于是转化成一个非常裸的树形背包.直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对.这里使用一种更通用的dfs序优化树形背包写法.https://www.cnb ...

  3. BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)

    BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包) 标签:题解 阅读体验 BZOJ题目链接 洛谷题目链接 具体实现 看到分数和最值,考虑分数规划 我们要求的是一个\(\dfrac{ ...

  4. [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序

    分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...

  5. bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)

    菜菜推荐的“水题”虐了我一天T T...(菜菜好强强qwq~ 显然是个分数规划题,二分答案算出p[i]-mid*s[i]之后在树上跑依赖背包,选k个最大值如果>0说明还有更优解. 第一次接触树形 ...

  6. bzoj4753 最佳团体

    题目描述 JSOI 信息学代表队一共有 NN 名候选人,这些候选人从 11 到 NN 编号.方便起见,JYY 的编号是 00 号.每个候选人都由一位编号比他小的候选人R_iRi​ 推荐.如果 R_i ...

  7. bzoj4753[JSOI2016]最佳团体

    题意:01分数规划,但可选的数字之间存在森林形的依赖关系(可以认为0号点是个虚根,因为并不能选). 虽然有森林形的依赖关系,但还是可以套分数规划的思路,二分答案k,判断是否存在一个比值大于k的方案 即 ...

  8. BZOJ4753:[JSOI2016]最佳团体——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4753 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. ...

  9. Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)

    题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...

随机推荐

  1. 00Enterprise Resource Planning

    Enterprise Resource Planning         企业资源计划即 ERP (Enterprise Resource Planning),由美国 Gartner Group 公司 ...

  2. POJ3107 Godfather (树形DP)

    题意:求树的重心 题解:先跑一遍dfs 预处理出这种遍历方式每个节点的儿子(含自己)的数 再跑一遍 每个点的值就是他所有儿子中取一个最大值 再和它父亲这个方向比较一下 又被卡常了 vector一直tl ...

  3. Duboo学习-SPI

    待补充 现将Dubbo-SPI相关源码流程图更新

  4. TestNG超时测试

    用@Test(timeOut = XXX) 指定超时时间,单位是毫秒 package com.janson; import org.testng.annotations.Test; public cl ...

  5. TestNG参数化测试

    参数化有两种方法: 第一种:在xml文件中声明 第二种:用@DataProvider注解 先介绍第一种方法: ParameterTest类:用@Parameters({"name" ...

  6. 每日命令:(3)pwd

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...

  7. shell日志颜色处理

    记录一下shell日志颜色处理 _COLORS=${BS_COLORS:-$(tput colors >/dev/)} __detect_color_support() { # shellche ...

  8. 【nginx】记录nginx+php-fpm实现大文件下载排坑的过程

    先上一段代码,支持大文件下载和断点续传,代码来源互联网. set_time_limit(0); // 省略取文件路径的过程,这里直接是文件完整路径 $filePath = get_save_path( ...

  9. AC自动机模板浅讲

    Description 给你N个单词,然后给定一个字符串,问一共有多少单词在这个字符串中出现过(输入相同的字符串算不同的单词,同一个单词重复出现只计一次). Input 第一行一个整数N,表示给定单词 ...

  10. node.js 发布订阅模式

    //导入内置模块 let EventEmitter = require('events'); let util=require('util'); //Man继承EventEmitter util.in ...