P1455 搭配购买

news2024/11/16 15:29:34

题目描述

明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有 nn 朵云,云朵已经被老板编号为 1,2,3,...,n1,2,3,...,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。

输入格式

第一行输入三个整数,n,m,wn,m,w,表示有 nn 朵云,mm 个搭配和你现有的钱的数目。

第二行至 n+1n+1 行,每行有两个整数, c_i,d_ici​,di​,表示第 ii 朵云的价钱和价值。

第 n+2n+2 至 n+1+mn+1+m 行 ,每行有两个整数 u_i,v_iui​,vi​。表示买第 u_iui​ 朵云就必须买第 v_ivi​ 朵云,同理,如果买第 v_ivi​ 朵就必须买第 u_iui​ 朵。

输出格式

一行,表示可以获得的最大价值。

输入输出样例

输入 #1复制

5 3 10
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2

输出 #1复制

1

说明/提示

  • 对于 30\%30% 的数据,满足 1 \le n \le 1001≤n≤100;
  • 对于 50\%50% 的数据,满足 1 \le n, w \le 10^31≤n,w≤103,1 \le m \le 1001≤m≤100;
  • 对于 100\%100% 的数据,满足 1 \le n, w \le 10^41≤n,w≤104,0 \le m \le 5 \times 10^30≤m≤5×103。

1.这是一道并查集加动态规划得题目。

2.我刚开始的思路是,找祖宗的同时,把价格和价值加到祖宗上去计算,然后动态规划用的也是二维背包。但是只AC了50%,一个案列WA,四个MLE(下面是那个50分的代码)。 

#include<stdio.h>
#define N 10010
#define M 5010
int n,m,w;
int dp[N][N];
typedef struct node
{
	int dad;
	int c;
	int d;
}NODE;
NODE a[N];
int getf(int x)
{
	if(a[x].dad==x) return x;
	else return getf(a[x].dad);
}
int merge(int x,int y)
{
	int p,q;
	p=getf(x);
	q=getf(y);
	if(p!=q)
	{
		a[q].dad=a[p].dad;
		a[p].c+=a[q].c;
		a[p].d+=a[q].d;
	}
}
int max(int a,int b)
{
	if(a>b) return a;
	return b;
}
int fun()
{
	int i,j,k;
	for(i=1;i<=n;i++)
	{
		k=getf(i);
		for(j=1;j<=w;j++)
		{
			if(j<a[k].c) dp[i][j]=dp[i-1][j];
			else dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[k].c]+a[k].d);
		}
	}
	printf("%d\n",dp[n][w]);
}
int main()
{
	int i,x,y;
	scanf("%d%d%d",&n,&m,&w);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i].c,&a[i].d);
		a[i].dad=i;
	}
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		merge(x,y);
	}
//	for(i=1;i<=n;i++)
//		printf("%d ",a[i].dad);
//	puts("");
	fun();
	return 0;
}

3.其实这一题是可以不用二维背包的,一维背包也是可以的,我们控制好价格和价值的关系即可。

4.用一维背包的话,大家可以看看一维背包的写法:

采药(c语言贪心算法)_lxh0113的博客-CSDN博客_算法采药问题

我们在使用  i   的过程中,去找 i 的祖宗,如果祖宗在book数组(该数组是来看当前是否已经取过值,因为我们会把同属于一个集合的价格和价值一起计算,下次是没有必要再去计算一遍,再计算一遍也会出错),book数组标记为 1 的时候我们是不需要管它的,然后就是book数组为0的情况,我们需要再把云朵数组遍历一遍,找到和 i 祖宗一样的,累加它。 

 

5.我们使用 累加的价格 p 累加的价值 q,去直接代入dp数组使用。就是下面这样,只不过改了形式。

6.最后输出dp[w]即可

 代码如下:

#include<stdio.h>
#define N 10010
#define M 5010
int n,m,w;
int dp[N],book[N]={0};
typedef struct node
{
	int dad;
	int c;
	int d;
}NODE;
NODE a[N];
int getf(int x)
{
	if(a[x].dad==x) return x;
	else return getf(a[x].dad);
}
int merge(int x,int y)
{
	int p,q;
	p=getf(x);
	q=getf(y);
	if(p!=q)
	{
		a[q].dad=a[p].dad;
	}
}
int pd(int x,int y)
{
	int p,q;
	p=getf(x);
	q=getf(y);
	if(p==q) return 1;
	else return 0;//是一个集合
}
int max(int a,int b)
{
	if(a>b) return a;
	return b;
}
int fun()
{
	int i,j,k,p,q,r;
	for(i=1;i<=n;i++)
	{
		k=getf(i);
		if(book[k]==0)
		{
			p=q=0;
			for(r=1;r<=n;r++)
			{
				if(pd(r,k)==1)
				{
					p+=a[r].c;
					q+=a[r].d;
					book[r]=1;
				}
			}
			for(j=w;j>=p;j--)
				dp[j]=max(dp[j],dp[j-p]+q);
		}
	}
	printf("%d\n",dp[w]);
//	for(i=1;i<=w;i++)
//		printf("%d ",dp[i]);
}
int main()
{
	int i,x,y;
	scanf("%d%d%d",&n,&m,&w);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i].c,&a[i].d);
		a[i].dad=i;
	}
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		merge(x,y);
	}
//	for(i=1;i<=n;i++)
//		printf("%d ",a[i].dad);
//	puts("");
	fun();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非Web服务弱口令检查工具下载与使用

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是非Web服务弱口令检查工具下载与使用。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1…

操作系统的运行机制和体系结构

文章目录&#x1f380;前言&#xff1a;本篇博客知识总览&#x1f3c5;运行机制&#x1f387;两种指令&#x1f387;两种状态&#x1f387;两种程序&#x1f3c5;操作系统的内核&#x1f387;内核概念&#xff1a;&#x1f3c5;操作系统的体系结构&#x1f3af;最常考点&#x…

DevOps - Jenkins可视化流水线(后端部分)

目录 &#x1f9e1;创建DevOps工程 &#x1f9e1;拉取代码 &#x1f9e1;项目编译 &#x1f9e1;构建镜像 &#x1f9e1;推送镜像 &#x1f9e1;部署到Dev环境 &#x1f9e1;邮件功能 &#x1f9e1;激活微服务 &#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习…

zookeeper下载安装

1、环境准备 ZooKeeper服务器是用Java创建的&#xff0c;它运行在JVM之上。需要安装JDK 7或更高版本。 2、上传 将下载的ZooKeeper放到/opt/ZooKeeper目录下 #上传zookeeper altp put f:/setup/apache-zookeeper-3.5.6-bin.tar.gz #打开 opt目录 cd /opt #创建zooKeeper目录…

电子招标采购系统源码之什么是电子招投标系统?

随着互联网时代的到来&#xff0c;各行业都受到不同的影响&#xff0c;其中招投标行业也不例外。为了顺应互联网潮流的发展&#xff0c;电子招投标逐渐取代传统的纸质的招投标方式&#xff0c;给招标方、投标方、招标代理等各方也带来了前所未有的机遇与挑战。那么什么是电子招…

日志采集 - Filebeat

Filebeat 是什么&#xff1f; Filebeat是本地文件的日志数据采集器&#xff0c;可监控日志目录或特定日志文件&#xff08;tail file&#xff09;&#xff0c;并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。 是使用 Golang 实现的轻量型日志采集器&#xff0c;也…

Spring Boot配置MinIO(实现文件上传、读取、下载、删除)

一、 MinIO MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&#x…

INSERT ON DUPLICATE KEY UPDATE返回值引起的小乌龙

一、东窗事发 某个版本送测,测试大佬给提了一个缺陷,且听我描述描述: 一个学习任务: 两个一模一样的学习动态: 产品定义:学习任务(生字学习)完成后,会在小程序生成一个动态,再次完成不重复生成obviously,上边出现的两个动态不符合“罗辑” 二、排查看看 既然出现了两个动态…

dubbo源码实践-transport 网络传输层的例子

1 Transporter层概述Transporter层位于第2层&#xff0c;已经实现了完整的TCP通信&#xff0c;定义了一套Dubbo自己的API接口&#xff0c;支持Netty、Mina等框架。官方定义&#xff1a;transport 网络传输层&#xff1a;抽象 mina 和 netty 为统一接口&#xff0c;以 Message 为…

剑指 Offer 09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#xff1a; 输入&#xff1a; ["…

自然语言处理 第11章 问答系统 复习

问答系统问答系统概述问答系统定义问答(QA)系统发展历程问答系统分类&#xff1a;问答系统框架&#xff1a;内容提要专家系统检索式问答系统1.问题分析主要功能&#xff1a;问题分类 和 关键词提取问题分类实现方法2.关键词提取检索模块相关文档检索句段检索3. 答案抽取模块检索…

回顾2022年,展望2023年

这里写目录标题回顾2022年博客之星你参加了吗&#xff1f;学习方面写博客方面在涨粉丝方面展望2023回顾2022年 时间如梭&#xff0c;转眼间已经2023年了。 你开始做总结了吗&#xff1f; 博客之星你参加了吗&#xff1f; 这是 2022 博客之星 的竞选帖子&#xff0c; 请你在这…

【从零开始学习深度学习】36. 门控循环神经网络之长短期记忆网络(LSTM)介绍、Pytorch实现LSTM并进行训练预测

上一篇文章介绍了一种门控循环神经网络门控循环单元GRU&#xff0c;本文将介绍另一种常用的门控循环神经网络&#xff1a;长短期记忆&#xff08;long short-term memory&#xff0c;LSTM&#xff09;&#xff0c;它比GRU稍复杂一点。 本文将介绍其实现方法&#xff0c;并使用其…

leetcode 221. 最大正方形-java题解

题目所属分类 动态规划 前面写过一个面积最大的长方形 传送门 f[i, j]表示&#xff1a;所有以(i,j)为右下角的且只包含 1 的正方形的边长最大值 原题链接 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 代…

最邻近方法和最邻近插入法求TSP问题近似解(可视化+代码)

摘要&#xff1a;本文总体内容为介绍用最邻近方法(Nearest Neighbor Algorithm) 和最邻近插入法求解旅行商问题(Traveling Saleman Problem,TSP)。同时使用python实现算法&#xff0c;并调用networkx库实现可视化。此文为本人图论课下作业的成品&#xff0c;含金量&#xff1a;…

【若依】前后端分离版本

一、何为框架&#xff1f;若依框架又是什么&#xff1f;具备什么功能&#xff1f; 框架的英文为Framework&#xff0c;带有骨骼&#xff0c;支架的含义。在软件工程中&#xff0c;框架往往被定义为整个或部分系统的可重用设计&#xff0c;是一个可重复使用的设计构件。类似于一…

leetcode1801:积压订单中的订单总数(1.2日每日一题)

迟来的元旦快乐&#xff01;&#xff01;&#xff01; 题目表述&#xff1a; 给你一个二维整数数组 orders &#xff0c;其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种…

电子档案利用安全控制的办法与实现

这篇文章是笔者2015年发表在《保密科学技术》第2期的一篇文章&#xff0c;时隔7年半温习了一遍之后感觉还有一定的可取之处&#xff0c;所以在结合当前档案法律法规相关要求并修改完善其中部分内容之后分享给大家。 引言 INTRODUCTION 21世纪是一个信息化高度发展的时代&#…

网站漏洞与漏洞靶场(DVWA)

数据来源 本文仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 为什么要攻击网站&#xff1f;常见的网站漏洞有哪些&#xff1f; 在互联网中&#xff0c;…

Java安装详细步骤(win10)

一、下载JDK JDK下载地址&#xff1a;Java Archive | Oracle&#xff0c;下图为win10版本 二、安装过程 2.1 以管理员方式运行exe 2.2 更改JDK安装目录和目标文件夹的位置 2.3 安装完成 三、配置环境变量 3.1 快速打开环境变量设置 WinR打开运行对话框&#xff0c;输入…