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(树形依赖+分组背包)的更多相关文章

  1. AcWing 286. 选课 (树形依赖分组背包)打卡

    有依赖的背包 首先依赖的概念,就是一个东西依附与一个东西之上,我们想买附品的话必须要把主品先买下来,这个可以先做下这道题 https://www.cnblogs.com/Lis-/p/11047466 ...

  2. HDU-1011 Starship Troopers (树形DP+分组背包)

    题目大意:给一棵有根带点权树,并且给出容量.求在不超过容量下的最大权值.前提是选完父节点才能选子节点. 题目分析:树上的分组背包. ps:特判m为0时的情况. 代码如下: # include<i ...

  3. Ural-1018 Binary Apple Tree(树形dp+分组背包)

    #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #i ...

  4. hdu 1561 树形dp+分组背包

    题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m) ...

  5. HDU4003Find Metal Mineral[树形DP 分组背包]

    Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Other ...

  6. hdu1561 The more, The Better 树形DP+分组背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路: 典型的树形背包题目: 定义dp[i][j]表示以i为根节点,攻打j个城堡的获得的财宝的最 ...

  7. 【P2015】二叉苹果树 (树形DP分组背包)

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 现在这颗树枝条太多了,需要剪枝.但是 ...

  8. poj2486 Apple Tree (树形dp+分组背包)

    题目链接:https://vjudge.net/problem/POJ-2486 题意:一棵点权树,起点在1,求最多经过m条边的最大点权和. 思路: 树形dp经典题.用3维状态,dp[u][j][0/ ...

  9. 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 ...

随机推荐

  1. AWS:5.公有云编程

    主要内容 1.AWS接口 2.使用AWS命令行 3.使用python sdk编程 AWS接口 Console:web控制台 登录amazon后在"我的账户" -> AWS管理 ...

  2. 360手机助手: App上架(提交资料)注意事项

    提交app资料尤其注意: .keystore和密码?由HBuilder提供公有证书: 签名证书KeyStore证书别名:hbuilder证书密码:123456keystore密码:123456 360 ...

  3. 转 Spring 组件 <context:component-scan base-pakage="">用法

    1.如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入. <!-- 注解注入 --> <co ...

  4. Javascript代码收集

    1.模仿jquery each 原文地址 function each(obj, fn){ var i; if(Object.prototype.toString.call(obj) === '[obj ...

  5. Python的pymysql模块

    PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2中则使用MySQLDB. 1.基本语法 # 导入pymysql模块 import pymysql # 连接da ...

  6. API的理解和使用——全局命令

    全局命令 命令 功能 set 创建键值对 keys 遍历查看所有键 exists 判断一个键是否存在,1存在,0不存在 dbsize 当前数据库中有多少个键 del 删除一个或多个键 expire 设 ...

  7. Java for LeetCode 137 Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  8. xutils3基本使用

    根目录下新建一个类继承application,调用xUtils3初始化方法 public class AtguiguApplication extends Application { @Overrid ...

  9. LightOJ - 1079 Just another Robbery —— 概率、背包

    题目链接:https://vjudge.net/problem/LightOJ-1079 1079 - Just another Robbery    PDF (English) Statistics ...

  10. 算法(Algorithms)第4版 练习 1.3.9

    主要思路: 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达 ...