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处理超大规模数据的4大方法详解

《Python处理超大规模数据的4大方法详解》在数据的奇妙世界里,数据量就像滚雪球一样,越变越大,从最初的GB级别的小数据堆,逐渐演变成TB级别的数据大山,所以本文我们就来看看Python处理... 目录1. Mars:数据处理界的 “变形金刚”2. Dask:分布式计算的 “指挥家”3. CuPy:GPU

Python中CSV文件处理全攻略

《Python中CSV文件处理全攻略》在数据处理和存储领域,CSV格式凭借其简单高效的特性,成为了电子表格和数据库中常用的文件格式,Python的csv模块为操作CSV文件提供了强大的支持,本文将深入... 目录一、CSV 格式简介二、csv模块核心内容(一)模块函数(二)模块类(三)模块常量(四)模块异常

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

Nginx部署React项目时重定向循环问题的解决方案

《Nginx部署React项目时重定向循环问题的解决方案》Nginx在处理React项目请求时出现重定向循环,通常是由于`try_files`配置错误或`root`路径配置不当导致的,本文给大家详细介... 目录问题原因1. try_files 配置错误2. root 路径错误解决方法1. 检查 try_f

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B