[POJ - 1015]Jury Compromise(01背包问题)

news2024/9/21 0:43:11

[POJ - 1015]Jury Compromise(01背包问题)

  • 一、问题
  • 二、分析
    • 1、状态表示
    • 2、状态转移
    • 3、方案输出
  • 三、代码

一、问题

在这里插入图片描述

二、分析

这道题可以转化为一个01背包问题,问题描述可以改为,每个物品具有两个属性 a a a b b b,我们需要在前 n n n个物品里选 m m m个。然后将我们选择的 m m m个物品的属性 a a a的总和记作 s u m a sum_a suma,属性 b b b的总和记作 s u m b sum_b sumb。我们要保证我们选择的 ∣ s u m a − s u m b ∣ |sum_a-sum_b| sumasumb是最小的。如果存在多种方案,都能够使得最后的绝对值是最小的,我们就需要在里面找出一个最大的 s u m a + s u m b sum_a+sum_b suma+sumb的方案。

1、状态表示

这道题的难度其实就难在状态表示,当状态表示相出来以后,其实这道题就好写很多了。

当题目中有多个限制条件的时候,我们常常将其中一个限制条件当作状态中的一个维度。

f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示在前 i i i个人里选 j j j个,且 s u m a − s u m b sum_a-sum_b sumasumb的数值为 k k k的条件下, s u m a + s u m b sum_a+sum_b suma+sumb的最大值。

这里面需要注意一个问题,就是在状态定义的过程中,我们的 s u m a − s u m b sum_a-sum_b sumasumb可能是一个负数,但是我们的数组只能存正数。所以我们需要给它加上一个偏移量。

根据题目的数据范围,我们的 s u m a − s u m b sum_a-sum_b sumasumb的范围是 [ − 400 , 400 ] [-400,400] [400,400],我们可以设置一个变量 b a s e = 400 base=400 base=400,然后将这个 b a s e base base加到我们的区间上,此时我们的区间范围就变成了 [ 0 , 800 ] [0,800] [0,800]就实现了一个映射关系,从而解决了数组越界的问题。

2、状态转移

既然是一个背包问题,我们就可以根据第 i i i个物品选或者不选来写转移方程。
f [ i ] [ j ] [ k ] = m a x ( f [ i − 1 ] [ j ] [ k ] , f [ i − 1 ] [ j − 1 ] [ k − ( s u m a − s u m b ) ] + ( s u m a + s u m b ) ) f[i][j][k]=max\bigg(f[i-1][j][k],f[i-1][j-1][k-(sum_a-sum_b)]+(sum_a+sum_b)\bigg) f[i][j][k]=max(f[i1][j][k],f[i1][j1][k(sumasumb)]+(suma+sumb))

3、方案输出

我们 d p dp dp的过程是正序枚举的,那么在方案输出的时候将顺序颠倒过来,同时将转移方程写成 i f if if语句判断即可。

三、代码

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 200 + 10;
int a[N], b[N];
int n,m;
int f[N][60][900];
void solve()
{
	int cnt = 0;
	while(cin >> n >> m, n || m)
	{
		cnt ++;
		cout << "Jury #" << cnt << endl;
		memset(f, -INF, sizeof f);
		f[0][0][400] = 0;
		for(int i = 1; i <= n; i ++ )
			cin >> a[i] >> b[i];
		
		for(int i = 1; i <= n; i ++)
			for(int j = 0; j <= m; j ++ )
				for(int k = 0; k <= 800; k ++)
				{
					f[i][j][k] = f[i - 1][j][k];
					if(j >= 1 && k - (a[i] - b[i]) >= 0 && k - (a[i] - b[i]) <= 800)
						f[i][j][k] = max(f[i - 1][j - 1][k - (a[i] - b[i])] + a[i] + b[i], f[i][j][k]);
				}

		int v = 0;
		while(f[n][m][400 - v] < 0 && f[n][m][400 + v] < 0)
			v++;

		if(f[n][m][400 - v] > f[n][m][400 + v])
			v = 400 - v;
		else
			v = 400 + v;

		int i = n, j = m, k = v;
		vector<int>ans;
		while(j)
		{
			if(f[i][j][k] == f[i - 1][j][k])i--;
			else
			{
				ans.push_back(i);
				k -= (a[i] - b[i]);
				i--, j--;
			}
		}
		int sa = 0, sb = 0;
		for(int x = 0; x < ans.size(); x ++)
		{
			sa += a[ans[x]];
			sb += b[ans[x]];
		}
		cout << "Best jury has value "<< sa << " for prosecution and value "<< sb << " for defence:" << endl;
		sort(ans.begin(), ans.end());
		for(int i = 0; i < ans.size(); i ++ )
		{
			cout << ans[i] << " ";
		}
		cout << endl << endl;
	}

}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	solve();
} 

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

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

相关文章

异构系统的事务统一处理模型Saga

承接上文分布式事务Seata-TCC事务模式 Saga事务模式相对来说是最复杂的&#xff0c;用的不多&#xff0c;只需要把概念理解透就可以了。 Saga是Seata提供的长事务解决方案&#xff0c;在业务流程中每个参与者都提供本地事务&#xff0c;当出现某个参与者失败的情况则补偿前面已…

如何设计一个牛逼的API接口

在日常开发中&#xff0c;总会接触到各种接口。前后端数据传输接口&#xff0c;第三方业务平台接口。一个平台的前后端数据传输接口一般都会在内网环境下通信&#xff0c;而且会使用安全框架&#xff0c;所以安全性可以得到很好的保护。这篇文章重点讨论一下提供给第三方平台的…

[自注意力神经网络]Mask Transfiner网络-论文解读

本文为CVPR2022的论文。国际惯例&#xff0c;先贴出原文和源码&#xff1a; 原论文地址https://arxiv.org/pdf/2111.13673.pdf源码地址https://github.com/SysCV/transfiner 一、概述 传统的Two-Stage网络&#xff0c;如Mask R-CNN虽然在实例分割上取得了较好的效果&#xff…

OSCP-Twiggy(ZeroMQ、SaltStack)

目录 扫描 ​编辑WEB 扫描 WEB 80端口 运行着一个名为Mezzanine的东西。快速的谷歌搜索显示这是一个内容管理系统,所以让我们看看它是否对任何可以在我们的目标机器上获得shell的东西都是脆弱的: mezzanine版本是4.3.1,并且此漏洞已在4.2.1中修补。 searchsploit没有返回…

说说MySQL中MVCC机制的原理

一、概述&#xff1a; 了解了MySql的底层架构后&#xff0c;我们今天要深入了解下什么是MVCC。 MVCC&#xff0c;全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制。MVCC是一种多并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据…

NAS私有云存储 - 搭建Nextcloud私有云盘并公网远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自内网穿透工具的文章&#xff1a;使用Nextcl…

LVS负载均衡集群

引言 如今&#xff0c;在各种互联网应用中&#xff0c;随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求也越来越高&#xff0c;单台服务器也将难以无法承担所有的访问需求。 一、群集的含义 集群、群集 由多台主机构成&#xff0c;但对外&#xff0c;只表现为一…

ubuntu-18.0.04 鸿蒙HarmonyOS系统源码(HOSP)下载

最近小编在研究鸿蒙开发&#xff0c;想要研究下鸿蒙源码&#xff0c;这里记录下源码下载中遇到的问题及解决&#xff0c;也为HarmonyOS的生态的建设提供下帮助&#xff0c;希望能帮到需要的人。 前置步骤&#xff1a;如果你之前下载过AOSP源码&#xff0c;那这里下载鸿蒙源码应…

第五章-数字水印-2-原理及实现

数字水印原理 根据之前图像获取位平面的操作可知&#xff0c;最低位位平面对整体图像的影响最小&#xff0c;因此数字水印的原理为在图像的最低有效位上嵌入隐藏信息&#xff0c;即在图像的最低位替换为数字水印位平面&#xff0c;完成数字的嵌入操作&#xff0c;对已嵌入数字…

Jenkins+Python自动化测试持续集成详细教程(全网独家)

目录 一、前言 二、环境准备 三、创建Jenkins Job 四、编写Python自动化测试脚本 五、测试报告生成与展示 六、持续集成流程优化 七、实战演练 八、常见问题及解决方案 九、结论 一、前言 Jenkins是目前最为流行的CI/CD工具之一&#xff0c;它可以支持多种语言和技术…

如何使用ffmpeg给视频减震去抖

之前自己发过一些记录仪拍下来的画面&#xff0c;你们可能已经看过了&#xff0c;例如&#xff1a; 最适合骑行的罐装饮料 然而&#xff0c;自己这个骑行记录仪&#xff0c;仅仅是很低端的一款&#xff0c;防抖功能很差&#xff0c;远远比不了GoPro那些高端的户外运动记录仪&am…

使用PCL滤波器实现点云裁剪

主要目的就是根据已知的ROI区域&#xff0c;对点云进行裁剪。要么留下点云ROI区域&#xff0c;要么去除。 ROI区域一般都是一个矩形&#xff0c;即&#xff08;x&#xff0c;y&#xff0c;width&#xff0c;height&#xff09;。 那么封装的函数形式一般如下&#xff1a; pcl:…

《死锁》与《CAS ABA》问题

文章目录 什么是死锁常见死锁情况❗️死锁的必要条件❗️如何避免死锁呢&#xff1f;CASCAS中ABA问题解决ABA问题 什么是死锁 死锁是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 。 常见死锁情况❗️ 1.一个线程一把…

Java-static那些事儿

static作为java中基础常用的关键字&#xff0c;通常用于修饰内部类&#xff0c;方法和变量和代码段&#xff0c;且具有以下特性&#xff1a; static修饰内部类时&#xff0c;该类属于静态内部类&#xff0c;其只能访问外部的静态变量和方法static修饰方法时&#xff0c;该方法…

ROS学习第三十七节——机器人运动控制以及里程计信息显示

https://download.csdn.net/download/qq_45685327/87719766 https://download.csdn.net/download/qq_45685327/87719873 gazebo 中已经可以正常显示机器人模型了&#xff0c;那么如何像在 rviz 中一样控制机器人运动呢&#xff1f;在此&#xff0c;需要涉及到ros中的组件: ros…

【mapbox+turf.js】WebGIS空间分析系列(1)

最近在想&#xff0c;自己一直使用webgis做的都是可视化的内容&#xff0c;缺少空间分析的功能。 所以吧&#xff0c;最近理一下使用mapbox turf来做一些基础的空间分析功能。 大概的思路是&#xff0c;获取目标图层&#xff08;多个图层&#xff09;&#xff0c;然后选择空…

servlet(2)—javaEE

1.获取请求数据 1.1开发前端发请求 ajax封装代码 // 参数 args 是一个 JS 对象, 里面包含了以下属性 // method: 请求方法 // url: 请求路径 // body: 请求的正文数据 // contentType: 请求正文的格式 // callback: 处理响应的回调函数, 有两个参数, 响应正文和响应的状态码…

qt中使用 ui 文件进行界面设计

目录 1、创建 Qt 应用 ​2、项目创建成功 3、直接点击打开 mainwindow.ui 文件 4、随便从左边侧边栏拖拽一个空间到 界面设计区域 5、在右侧边栏右键点击 pushButton 控件&#xff0c;点击转到槽 6、根据实际需要选择对应的信号&#xff0c;我这里方便演示选择 clicked&a…

linux 信号量semget/semop/semctl

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 概述 原理机制 接口说明 代码演示 结尾 前言 本专栏主要分享linux下并发编…

基于 多态 的职工管理系统(Staff Management System)

目录 一、管理系统需求 作用&#xff1a;管理公司内所有员工的信息 分类&#xff1a;要显示每位员工的编号、姓名、岗位与职责 具体实现的功能&#xff1a; 二、创建管理 类 三、各个接口函数 1、菜单展示功能 2、 选择功能 3、创建员工功能 ①普通员工employee ②经理…