Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

【背景】

Wind设计了很多机器人。但是它们都认为自己是最强的,于是,一场比赛开始了~

【问题描述】

机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品。

它们到了一个仓库,里面有n个物品,每个物品都有一个价值Pi和重量Wi,但是有些物品放在一起会爆炸,并且爆炸具有传递性。

(a和b会爆炸、b和c会爆炸则a和c会爆炸)机器人们可不想因此损失自己好不容易从Wind那里敲诈来的装备,于是它们想知道在

能力范围内,它们最多可以拿多少价值的物品。

你能帮助它们吗?

【输入格式】

每组测试数据

第1行为n,Wmax,k(0<=n,Wmax,k<=1000)

接下来n行,为每个物品的Pi,Wi(0<=Pi<=1000,1<=Wi<=10,均为整数)

再接下来k行,每行2个数字a,b表示a和b会发生爆炸

【输出格式】

对每组数据输出1行

为最大可能价值

Sample Input

3 10 1
100 1
200 5
10 5
1 2

Sample Output

   210

【题解】

a和b会发生爆炸。即a,b中只能选一个。也即分组背包问题。

首先,如果x和y会发生爆炸就把x和y合并在一起(并查集),然后根据合并的情况构造出k组物品。每组中都只能选取一个物品。

然后先for k组背包。表示按照组的顺序进行背包的操作。

然后是for 容量。表示接下来为j容量选取一个物品。

然后是for第k组物品中的具体每一个物品。

因为先for的是容量。所以可以保证。只会选取第k组物品中的一个物品。

最后输出答案即可。

【代码】

#include <cstdio>

int fa[1001],n,wmax,k,c[1001],w[1001],f[1001],next[1001],first[1001],what[1001],num = 0;

int findfather(int x) //用来寻找根节点,同时路径压缩
{
if (fa[x] != x)
fa[x] = findfather(fa[x]);
return fa[x];
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%d%d%d",&n,&wmax,&k);
for (int i = 1;i <= n;i++)
scanf("%d%d",&c[i],&w[i]);
for (int i = 1;i <= n;i++) //并查集数组初始化操作
fa[i] = i;
for (int i = 1;i <= k;i++) //输入k个抵触关系
{
int x,y;
scanf("%d%d",&x,&y);
int r1 = findfather(x),r2 = findfather(y);
if (r1 != r2) //把这两个物品合并在一起,即同一组物品
fa[r2] = r1;
}
for (int i = 1;i <= n;i++) //把所有的子节点指向根节点
findfather(i);
int bo[1001] = {0}; //用来标记某一个物品是哪一组的物品
k = 0;
for (int i =1;i <= n;i++)
if (bo[fa[i]] == 0) //这是第一次出现第k组物品的处理方法
{
k++;
bo[fa[i]] = k;
num++;
next[num] = first[k]; //这里用了邻接表来记录k组物品的每一个物品 为了省空间
what[num] = i;
first[k] = num;
}
else //不是第一次出现则记录就好 可以缩短代码。。想缩短就缩吧。-> 邻接表那段可以不用写两次
{
num++;
next[num] = first[bo[fa[i]]];
what[num] = i;
first[bo[fa[i]]] = num;
}
for (int i = 1;i <= k;i++) //进行分组背包的操作
for (int j = wmax;j >= 0;j--)
{
int temp = first[i]; //这是邻接表读取数据的方法
while (temp != 0)
{
int l = what[temp];
if (j >= w[l]) //如果没有超过背包容量 则进行更新
{
if (f[j] < f[j-w[l]] + c[l])
f[j] = f[j-w[l]] + c[l];
}
temp = next[temp];
}
}
printf("%d",f[wmax]); //最后输出答案。
return 0;
}

【t064】最勇敢的机器人的更多相关文章

  1. vijos 1250 最勇敢的机器人 分组背包+并查集

    P1250最勇敢的机器人 背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n ...

  2. / Vijos / 题库 /1250 / 最勇敢的机器人

    / Vijos / 题库 /1250 / 最勇敢的机器人 借鉴博客:http://www.cnblogs.com/chty/p/5830516.html 背景 Wind设计了很多机器人.但是它们都认为 ...

  3. vijos1250 最勇敢的机器人

    背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n个物品,每个物品都有一个价 ...

  4. 【Vijos1250】最勇敢的机器人(并查集,分组背包DP)

    题意:有N个物品,承重上限为M,有K组物品互斥关系,互斥关系有传递性,即1与2互斥,2与3互斥,1与3也互斥 给出每个物品的花费和价值,求承重上限内的最大价值总和 n<=1000,m<=1 ...

  5. 【翻译】用AIML实现的Python人工智能聊天机器人

    前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...

  6. 3.C#面向对象基础聊天机器人

    基于控制台的简单版的聊天机器人,词库可以自己添加. 聊天机器人1.0版本 源码如下: using System; using System.Collections.Generic; using Sys ...

  7. Python 简易聊天机器人

    聊天机器人 | |-----MySql | |---module--"逻辑运算层" | | | |---ciku--"与词库交互" | | | |---dict ...

  8. java 聊天猜拳机器人

    2016-12-06本随笔记录第一次制作经过,感谢各位大神指导. 工具:eclipse;JAVA JDK; 语言:java 时间:2016.11.23 作者:潇洒鸿图 地址:http://www.cn ...

  9. 用VB实现SmartQQ机器人

    这里为了便于介绍程序设计的流程,更多以代码形式给出,具体可用火狐浏览器的firebug插件来抓包分析,或者用谷歌浏览器的开发者工具进行抓包.抓包地址是:http://w.qq.com 第一步,是二维码 ...

随机推荐

  1. Android 开发之锁屏弹窗

    尝试利用 WindowManager 添加浮窗的方式实现 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级来让窗 ...

  2. 1.16 Python基础知识 - 装饰器初识

    Python中的装饰器就是函数,作用就是包装其他函数,为他们起到修饰作用.在不修改源代码的情况下,为这些函数额外添加一些功能,像日志记录,性能测试等.一个函数可以使用多个装饰器,产生的结果与装饰器的位 ...

  3. 基于mpvue的小程序项目搭建的步骤

    mpvue 是美团开源的一套语法与vue.js一致的.快速开发小程序的前端框架,按官网说可以达到小程序与H5界面使用一套代码.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小 ...

  4. java线程——详解Callable、Future和FutureTask

    回顾: 接上篇博客 java线程--三种创建线程的方式,这篇博客主要介绍第三种方式Callable和Future.比较继承Thread类和实现Runnable接口,接口更加灵活,使用更广泛.但这两种方 ...

  5. c#下halcon配置

    1.在halcon中写入算子,实现函数过程 比如: read_image(Image,'D:/MyFile/halcon/数字识别/1.jpg') decompose3(Image, ImageR, ...

  6. Stable Matching (Gale Sharpley Algorithm)

    稳定婚配问题:n个男生n个女生.当中每一个人都有自己心仪的列表. 问怎样达成稳定的匹配(比方, b想B求婚,可是B已有的对象的优先级高于b,此时b的魅力不足以拆散B所处的那一对,即达到稳定状态.) ( ...

  7. NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射

    系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...

  8. iOS之StatusBar详解

    随便打开手机上的主流APP,我们不难发现它们的状态栏都是跟导航栏保持一致的背景颜色,如下图的微信和instagram: WECHAT.PNG INS.PNG 那么今天我们就来说一下StatusBar这 ...

  9. Spring Boot 2.x 使用 jpa 连接 mysql

    在spring boot网站上生成一个项目,如图: 我使用的是Maven项目,java使用是jdk8(spring boot 2.x必须要jdk8及以上),dependencies分别输入选择 web ...

  10. ZOJ 2476 Total Amount 字符串

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1476 题目大意: 给你n串数字组成的字符串,要求输出他们相加的和. 如:n=  ...