POJ 2184 Cow Exhibition 0-1背包变种之处理负值 dp循环方向理解

2023-10-17 09:38

本文主要是介绍POJ 2184 Cow Exhibition 0-1背包变种之处理负值 dp循环方向理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

Description
“Fat and docile, big and dumb, they look so stupid, they aren’t much
fun…”
-Cows with Guns by Dana Lyons
The cows want to prove to the public that they are both smart and fun. In order to do this, Bessie has organized an exhibition that will be put on by the cows. She has given each of the N (1 <= N <= 100) cows a thorough interview and determined two values for each cow: the smartness Si (-1000 <= Si <= 1000) of the cow and the funness Fi (-1000 <= Fi <= 1000) of the cow.
Bessie must choose which cows she wants to bring to her exhibition. She believes that the total smartness TS of the group is the sum of the Si’s and, likewise, the total funness TF of the group is the sum of the Fi’s. Bessie wants to maximize the sum of TS and TF, but she also wants both of these values to be non-negative (since she must also show that the cows are well-rounded; a negative TS or TF would ruin this). Help Bessie maximize the sum of TS and TF without letting either of these values become negative.
Input
Line 1: A single integer N, the number of cows
Lines 2…N+1: Two space-separated integers Si and Fi, respectively the smartness and funness for each cow.
Output
Line 1: One integer: the optimal sum of TS and TF such that both TS and TF are non-negative. If no subset of the cows has non-negative TS and non- negative TF, print 0.
Sample Input
5
-5 7
8 -6
6 -3
2 1
-8 -5
Sample Output
8
Hint
OUTPUT DETAILS:
Bessie chooses cows 1, 3, and 4, giving values of TS = -5+6+2 = 3 and TF
= 7-3+1 = 5, so 3+5 = 8. Note that adding cow 2 would improve the value
of TS+TF to 10, but the new value of TF would be negative, so it is not
allowed.

大致题意:
共有N头牛,接下来N行是每头牛的智商和情商,从这些牛中任选若干头,使得牛的智商和(TS)+情商和(TF)最大,同时智商和(TS),情商和(TF)都不小于0。

解题思路:
以智商为容量,求前i头牛在智商为j的情况下的最大情商,将问题转化为0-1背包之恰好装满一定的容积

dp[j]:=前i头牛在智商为j的情况下的最大情商
将i从1到n遍历,同时更新dp[j]
状态转移方程:dp[j]=max(dp[j], dp[j-w[i]]+v[i])
-1000 <= Si <= 1000     1=<n<=100

为了避免负数作为下标,智商和(TS)都加上100000,整体的范围就变为[0,200000]

初始化时dp[100000]=0,其余的dp[j]=-INF 这里我们用-INF表示不存在的情况(因为需要恰好装满体积 j ,所以我们可以先判断前提条件存不存在)

w[i]>0时,dp[j]的计算顺序为从大往小计算,因为在计算前i头牛的最优情商和时,dp[j-w[i]]是前i-1头牛的最优情商和,而这个值在dp[j]的左侧,所以我们从右往左计算,这样就可以利用前i-1的解,不会覆盖。
同理当w[i]<=0时,dp[j]的计算顺序为从小往大计算,因为dp[j-w[i]]这个时候在dp[ j ]的右侧了。
(想一想数组重复利用的过程便不难理解了)

AC代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;int dp[200005];
int w[101]; int v[101];
#define M 100000
#define INF 0x3fffffff
int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> w[i] >> v[i];}for (int i = 0; i <= 200000; i++) { dp[i] = -INF; }dp[100000] = 0;for (int i = 1; i <= n; i++) {if (w[i] > 0) {for (int j = 200000; j >= w[i]; j--) {if (dp[j - w[i]] != -INF) {//前置条件成立dp[j] = max(dp[j], dp[j - w[i]] + v[i]);}}}else {for (int j = 0; j <= 200000+w[i]; j++) {if (dp[j - w[i]] != -INF) {//前置条件成立dp[j] = max(dp[j], dp[j - w[i]] + v[i]);}}}}int ans = 0;for (int i = 100000; i <= 200000; i++) {if (dp[i] < 0)continue;ans = max(ans, dp[i] + i - 100000);}cout << ans << endl;//system("pause");
}

解题过程中参考的大神博客:
POJ 2184 Cow Exhibition (处理负值的01背包)

这篇关于POJ 2184 Cow Exhibition 0-1背包变种之处理负值 dp循环方向理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/224518

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir