CSU - 1580 NCPC2014 Outing(树形依赖+分组背包)
Outing
Input
Output
Sample Input
4 4
1 2 3 4
Sample Output
4 分组背包:
for 所有的组k
for v=V..0
for 所有的i属于组k
f[v]=max{f[v],f[v-c[i]]+w[i]}
有一辆能载客m的车,有n个人,然后第i个人上车的条件是第a[i]个人要上车,问最多能上几个。
显然,一个连通块至多含有一个环。每一块的价值范围在【环点,块点】之间,将每一块视为一组,从每组的范围中任取一值,组成不超过m的最大值。因此可转换成分组背包模型。
#include<bits/stdc++.h>
#define MAX 1005
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll; int pre[MAX],f[MAX],a[MAX],b[MAX],bb[MAX];
int dp[MAX]; int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
int dfs(int x,int be,int s){ if(b[x]==) return s;
b[x]=;
return dfs(pre[x],be,s+);
}
int main()
{
int t,n,m,i,j,k;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++){
f[i]=i;
}
for(i=;i<=n;i++){
scanf("%d",&pre[i]);
int fi=find(i),fx=find(pre[i]);
if(fi!=fx){
f[fi]=fx;
}
}
memset(a,,sizeof(a));
for(i=;i<=n;i++){
memset(b,,sizeof(b));
a[i]=dfs(i,i,);
}
memset(b,INF,sizeof(b));
memset(bb,,sizeof(bb));
for(i=;i<=n;i++){
b[find(i)]=min(a[i],b[find(i)]);
bb[find(i)]++;
}
memset(dp,,sizeof(dp));
for(i=;i<=n;i++){
if(b[i]!=INF){
for(j=m;j>=;j--){
for(k=b[i];k<=bb[i];k++){
if(j-k<) continue;
dp[j]=max(dp[j],dp[j-k]+k);
}
}
}
}
printf("%d\n",dp[m]);
return ;
}
CSU - 1580 NCPC2014 Outing(树形依赖+分组背包)的更多相关文章
- AcWing 286. 选课 (树形依赖分组背包)打卡
有依赖的背包 首先依赖的概念,就是一个东西依附与一个东西之上,我们想买附品的话必须要把主品先买下来,这个可以先做下这道题 https://www.cnblogs.com/Lis-/p/11047466 ...
- HDU-1011 Starship Troopers (树形DP+分组背包)
题目大意:给一棵有根带点权树,并且给出容量.求在不超过容量下的最大权值.前提是选完父节点才能选子节点. 题目分析:树上的分组背包. ps:特判m为0时的情况. 代码如下: # include<i ...
- Ural-1018 Binary Apple Tree(树形dp+分组背包)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #i ...
- hdu 1561 树形dp+分组背包
题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m) ...
- HDU4003Find Metal Mineral[树形DP 分组背包]
Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Other ...
- hdu1561 The more, The Better 树形DP+分组背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路: 典型的树形背包题目: 定义dp[i][j]表示以i为根节点,攻打j个城堡的获得的财宝的最 ...
- 【P2015】二叉苹果树 (树形DP分组背包)
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 现在这颗树枝条太多了,需要剪枝.但是 ...
- poj2486 Apple Tree (树形dp+分组背包)
题目链接:https://vjudge.net/problem/POJ-2486 题意:一棵点权树,起点在1,求最多经过m条边的最大点权和. 思路: 树形dp经典题.用3维状态,dp[u][j][0/ ...
- hdu 4003 树形dp+分组背包 2011大连赛区网络赛C
题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 链接:点我 Sample Input 3 1 1 //3个点,从1出发,1个机器人 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 ...
随机推荐
- AWS:5.公有云编程
主要内容 1.AWS接口 2.使用AWS命令行 3.使用python sdk编程 AWS接口 Console:web控制台 登录amazon后在"我的账户" -> AWS管理 ...
- 360手机助手: App上架(提交资料)注意事项
提交app资料尤其注意: .keystore和密码?由HBuilder提供公有证书: 签名证书KeyStore证书别名:hbuilder证书密码:123456keystore密码:123456 360 ...
- 转 Spring 组件 <context:component-scan base-pakage="">用法
1.如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入. <!-- 注解注入 --> <co ...
- Javascript代码收集
1.模仿jquery each 原文地址 function each(obj, fn){ var i; if(Object.prototype.toString.call(obj) === '[obj ...
- Python的pymysql模块
PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2中则使用MySQLDB. 1.基本语法 # 导入pymysql模块 import pymysql # 连接da ...
- API的理解和使用——全局命令
全局命令 命令 功能 set 创建键值对 keys 遍历查看所有键 exists 判断一个键是否存在,1存在,0不存在 dbsize 当前数据库中有多少个键 del 删除一个或多个键 expire 设 ...
- Java for LeetCode 137 Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- xutils3基本使用
根目录下新建一个类继承application,调用xUtils3初始化方法 public class AtguiguApplication extends Application { @Overrid ...
- LightOJ - 1079 Just another Robbery —— 概率、背包
题目链接:https://vjudge.net/problem/LightOJ-1079 1079 - Just another Robbery PDF (English) Statistics ...
- 算法(Algorithms)第4版 练习 1.3.9
主要思路: 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达 ...